Ticket #1613: django-dojo.2.diff

File django-dojo.2.diff, 201.9 KB (added by James Bennett, 18 years ago)

updated patch

  • media/css/widgets.css

     
    4242.file-upload .deletelink { margin-left:5px; }
    4343
    4444/* CALENDARS & CLOCKS */
    45 .calendarbox, .clockbox { margin:5px auto; width: 10em; text-align: center; background:white; position:relative; }
     45.calendarbox, .clockbox { margin:5px auto; font-size: 11px; width: 16em; text-align: center; background:white; position:relative; }
    4646.clockbox { width:6em; }
    4747.calendar { margin:0; padding: 0; }
    48 .calendar table { margin: 0; padding: 0; border-collapse:collapse; background:white; width:99%; }
     48.calendar table { margin:0; padding:0; border-collapse:collapse; background:white; width:99%; }
    4949.calendar caption, .calendarbox h2 { margin: 0; font-size:11px; text-align:center; border-top:none; }
    5050.calendar th { font-size:10px; color:#666; padding:2px 3px; text-align:center; background:#e1e1e1 url(../img/admin/nav-bg.gif) 0 50% repeat-x; border-bottom:1px solid #ddd; }
    5151.calendar td { font-size:11px; text-align: center; padding: 0; border-top:1px solid #eee; border-bottom:none; }
  • media/js/SelectFilter.js

     
    1 /*
    2 SelectFilter - Turns a multiple-select box into a filter interface.
    3 
    4 Requires SelectBox.js and addevent.js.
    5 */
    6 
    7 function findForm(node) {
    8     // returns the node of the form containing the given node
    9     if (node.tagName.toLowerCase() != 'form') {
    10         return findForm(node.parentNode);
    11     }
    12     return node;
    13 }
    14 
    15 var SelectFilter = {
    16     init: function(field_id) {
    17         var from_box = document.getElementById(field_id);
    18         from_box.id += '_from'; // change its ID
    19         // Create the INPUT input box
    20         var input_box = document.createElement('input');
    21         input_box.id = field_id + '_input';
    22         input_box.setAttribute('type', 'text');
    23         from_box.parentNode.insertBefore(input_box, from_box);
    24         from_box.parentNode.insertBefore(document.createElement('br'), input_box.nextSibling);
    25         // Create the TO box
    26         var to_box = document.createElement('select');
    27         to_box.id = field_id + '_to';
    28         to_box.setAttribute('multiple', 'multiple');
    29         to_box.setAttribute('size', from_box.size);
    30         from_box.parentNode.insertBefore(to_box, from_box.nextSibling);
    31         to_box.setAttribute('name', from_box.getAttribute('name'));
    32         from_box.setAttribute('name', from_box.getAttribute('name') + '_old');
    33         // Give the filters a CSS hook
    34         from_box.setAttribute('class', 'filtered');
    35         to_box.setAttribute('class', 'filtered');
    36         // Set up the JavaScript event handlers for the select box filter interface
    37         addEvent(input_box, 'keyup', function(e) { SelectFilter.filter_key_up(e, field_id); });
    38         addEvent(input_box, 'keydown', function(e) { SelectFilter.filter_key_down(e, field_id); });
    39         addEvent(from_box, 'dblclick', function() { SelectBox.move(field_id + '_from', field_id + '_to'); });
    40         addEvent(from_box, 'focus', function() { input_box.focus(); });
    41         addEvent(to_box, 'dblclick', function() { SelectBox.move(field_id + '_to', field_id + '_from'); });
    42         addEvent(findForm(from_box), 'submit', function() { SelectBox.select_all(field_id + '_to'); });
    43         SelectBox.init(field_id + '_from');
    44         SelectBox.init(field_id + '_to');
    45         // Move selected from_box options to to_box
    46         SelectBox.move(field_id + '_from', field_id + '_to');
    47     },
    48     filter_key_up: function(event, field_id) {
    49         from = document.getElementById(field_id + '_from');
    50         // don't submit form if user pressed Enter
    51         if ((event.which && event.which == 13) || (event.keyCode && event.keyCode == 13)) {
    52             from.selectedIndex = 0;
    53             SelectBox.move(field_id + '_from', field_id + '_to');
    54             from.selectedIndex = 0;
    55             return false;
    56         }
    57         var temp = from.selectedIndex;
    58         SelectBox.filter(field_id + '_from', document.getElementById(field_id + '_input').value);
    59         from.selectedIndex = temp;
    60         return true;
    61     },
    62     filter_key_down: function(event, field_id) {
    63         from = document.getElementById(field_id + '_from');
    64         // right arrow -- move across
    65         if ((event.which && event.which == 39) || (event.keyCode && event.keyCode == 39)) {
    66             var old_index = from.selectedIndex;
    67             SelectBox.move(field_id + '_from', field_id + '_to');
    68             from.selectedIndex = (old_index == from.length) ? from.length - 1 : old_index;
    69             return false;
    70         }
    71         // down arrow -- wrap around
    72         if ((event.which && event.which == 40) || (event.keyCode && event.keyCode == 40)) {
    73             from.selectedIndex = (from.length == from.selectedIndex + 1) ? 0 : from.selectedIndex + 1;
    74         }
    75         // up arrow -- wrap around
    76         if ((event.which && event.which == 38) || (event.keyCode && event.keyCode == 38)) {
    77             from.selectedIndex = (from.selectedIndex == 0) ? from.length - 1 : from.selectedIndex - 1;
    78         }
    79         return true;
    80     }
    81 }
  • media/js/SelectFilter2.js

     
    1 /*
    2 SelectFilter2 - Turns a multiple-select box into a filter interface.
    3 
    4 Different than SelectFilter because this is coupled to the admin framework.
    5 
    6 Requires core.js, SelectBox.js and addevent.js.
    7 */
    8 
    9 function findForm(node) {
    10     // returns the node of the form containing the given node
    11     if (node.tagName.toLowerCase() != 'form') {
    12         return findForm(node.parentNode);
    13     }
    14     return node;
    15 }
    16 
    17 var SelectFilter = {
    18     init: function(field_id, field_name, is_stacked, admin_media_prefix) {
    19         var from_box = document.getElementById(field_id);
    20         from_box.id += '_from'; // change its ID
    21         from_box.className = 'filtered';
    22 
    23         // Remove <p class="info">, because it just gets in the way.
    24         var ps = from_box.parentNode.getElementsByTagName('p');
    25         for (var i=0; i<ps.length; i++) {
    26             from_box.parentNode.removeChild(ps[i]);
    27         }
    28 
    29         // <div class="selector"> or <div class="selector stacked">
    30         var selector_div = quickElement('div', from_box.parentNode);
    31         selector_div.className = is_stacked ? 'selector stacked' : 'selector';
    32 
    33         // <div class="selector-available">
    34         var selector_available = quickElement('div', selector_div, '');
    35         selector_available.className = 'selector-available';
    36         quickElement('h2', selector_available, interpolate(gettext('Available %s'), [field_name]));
    37         var filter_p = quickElement('p', selector_available, '');
    38         filter_p.className = 'selector-filter';
    39         quickElement('img', filter_p, '', 'src', admin_media_prefix + 'img/admin/selector-search.gif');
    40         filter_p.appendChild(document.createTextNode(' '));
    41         var filter_input = quickElement('input', filter_p, '', 'type', 'text');
    42         filter_input.id = field_id + '_input';
    43         selector_available.appendChild(from_box);
    44         var choose_all = quickElement('a', selector_available, gettext('Choose all'), 'href', 'javascript: (function(){ SelectBox.move_all("' + field_id + '_from", "' + field_id + '_to"); })()');
    45         choose_all.className = 'selector-chooseall';
    46 
    47         // <ul class="selector-chooser">
    48         var selector_chooser = quickElement('ul', selector_div, '');
    49         selector_chooser.className = 'selector-chooser';
    50         var add_link = quickElement('a', quickElement('li', selector_chooser, ''), gettext('Add'), 'href', 'javascript: (function(){ SelectBox.move("' + field_id + '_from","' + field_id + '_to");})()');
    51         add_link.className = 'selector-add';
    52         var remove_link = quickElement('a', quickElement('li', selector_chooser, ''), gettext('Remove'), 'href', 'javascript: (function(){ SelectBox.move("' + field_id + '_to","' + field_id + '_from");})()');
    53         remove_link.className = 'selector-remove';
    54 
    55         // <div class="selector-chosen">
    56         var selector_chosen = quickElement('div', selector_div, '');
    57         selector_chosen.className = 'selector-chosen';
    58         quickElement('h2', selector_chosen, interpolate(gettext('Chosen %s'), [field_name]));
    59         var selector_filter = quickElement('p', selector_chosen, gettext('Select your choice(s) and click '));
    60         selector_filter.className = 'selector-filter';
    61         quickElement('img', selector_filter, '', 'src', admin_media_prefix + 'img/admin/selector-add.gif', 'alt', 'Add');
    62         var to_box = quickElement('select', selector_chosen, '', 'id', field_id + '_to', 'multiple', 'multiple', 'size', from_box.size, 'name', from_box.getAttribute('name'));
    63         to_box.className = 'filtered';
    64         var clear_all = quickElement('a', selector_chosen, gettext('Clear all'), 'href', 'javascript: (function() { SelectBox.move_all("' + field_id + '_to", "' + field_id + '_from");})()');
    65         clear_all.className = 'selector-clearall';
    66 
    67         from_box.setAttribute('name', from_box.getAttribute('name') + '_old');
    68 
    69         // Set up the JavaScript event handlers for the select box filter interface
    70         addEvent(filter_input, 'keyup', function(e) { SelectFilter.filter_key_up(e, field_id); });
    71         addEvent(filter_input, 'keydown', function(e) { SelectFilter.filter_key_down(e, field_id); });
    72         addEvent(from_box, 'dblclick', function() { SelectBox.move(field_id + '_from', field_id + '_to'); });
    73         addEvent(to_box, 'dblclick', function() { SelectBox.move(field_id + '_to', field_id + '_from'); });
    74         addEvent(findForm(from_box), 'submit', function() { SelectBox.select_all(field_id + '_to'); });
    75         SelectBox.init(field_id + '_from');
    76         SelectBox.init(field_id + '_to');
    77         // Move selected from_box options to to_box
    78         SelectBox.move(field_id + '_from', field_id + '_to');
    79     },
    80     filter_key_up: function(event, field_id) {
    81         from = document.getElementById(field_id + '_from');
    82         // don't submit form if user pressed Enter
    83         if ((event.which && event.which == 13) || (event.keyCode && event.keyCode == 13)) {
    84             from.selectedIndex = 0;
    85             SelectBox.move(field_id + '_from', field_id + '_to');
    86             from.selectedIndex = 0;
    87             return false;
    88         }
    89         var temp = from.selectedIndex;
    90         SelectBox.filter(field_id + '_from', document.getElementById(field_id + '_input').value);
    91         from.selectedIndex = temp;
    92         return true;
    93     },
    94     filter_key_down: function(event, field_id) {
    95         from = document.getElementById(field_id + '_from');
    96         // right arrow -- move across
    97         if ((event.which && event.which == 39) || (event.keyCode && event.keyCode == 39)) {
    98             var old_index = from.selectedIndex;
    99             SelectBox.move(field_id + '_from', field_id + '_to');
    100             from.selectedIndex = (old_index == from.length) ? from.length - 1 : old_index;
    101             return false;
    102         }
    103         // down arrow -- wrap around
    104         if ((event.which && event.which == 40) || (event.keyCode && event.keyCode == 40)) {
    105             from.selectedIndex = (from.length == from.selectedIndex + 1) ? 0 : from.selectedIndex + 1;
    106         }
    107         // up arrow -- wrap around
    108         if ((event.which && event.which == 38) || (event.keyCode && event.keyCode == 38)) {
    109             from.selectedIndex = (from.selectedIndex == 0) ? from.length - 1 : from.selectedIndex - 1;
    110         }
    111         return true;
    112     }
    113 }
  • media/js/django/string.js

     
     1dojo.provide('django.string');
     2
     3django.string = {
     4   pad_left: function(str, pad_length, pad_string) {
     5      var new_string = str;
     6      for (var i = 0; new_string.length < pad_length; i++) {
     7         new_string = pad_string + new_string;
     8      }
     9      return new_string;
     10   }
     11};
     12 No newline at end of file
  • media/js/django/admin.js

     
     1dojo.provide('django.admin');
     2dojo.require('django.util');
     3
     4django.admin = {
     5   init: function() {
     6      if(typeof(auto_populate_array) != 'undefined') {
     7//       dojo.require('django.admin.AutoPopulate');
     8         django.admin.AutoPopulate.init(auto_populate_array);
     9      }
     10
     11      if(typeof(select_filter_array) != 'undefined') {
     12         dojo.require('django.widget.SelectFilter');
     13         django.admin.initFilterWidgets(select_filter_array, admin_media_prefix);
     14      }
     15
     16      if(typeof(date_time_fields) != 'undefined') {
     17         dojo.require('django.widget.DateTime');
     18      }
     19
     20      if(typeof(first_form_field_id) != 'undefined') {
     21         document.getElementById(first_form_field_id).focus();
     22      }
     23
     24      dojo.require('django.admin.RelatedLookups');
     25      django.admin.RelatedLookups.init();
     26      dojo.require('django.admin.CollapsedFieldsets');
     27   },
     28
     29   initFilterWidgets: function(filterElementArray) {
     30      for(var field in filterElementArray) {
     31         django.widget.SelectFilter.init(field, filterElementArray[field][0], filterElementArray[field][1], filterElementArray[field][2]);
     32      }
     33   }
     34};
     35
     36dojo.addOnLoad(django.admin.init);
     37 No newline at end of file
  • media/js/django/widget/SelectFilter.js

     
     1dojo.provide('django.widget.SelectFilter');
     2dojo.require('django.util');
     3dojo.require('django.widget.SelectBox');
     4
     5django.widget.SelectFilter = {
     6   init: function(field_id, field_name, is_stacked, admin_media_prefix) {
     7      var from_box = document.getElementById(field_id);
     8      from_box.id += '_from'; // change its ID
     9      from_box.className = 'filtered';
     10     
     11      // Remove <p class="info">, because it just gets in the way.
     12      var ps = from_box.parentNode.getElementsByTagName('p');
     13      for (var i=0; i<ps.length; i++) {
     14         from_box.parentNode.removeChild(ps[i]);
     15      }
     16     
     17      // <div class="selector"> or <div class="selector stacked">
     18      var selector_div = django.util.quickElement('div', from_box.parentNode);
     19      selector_div.className = is_stacked ? 'selector stacked' : 'selector';
     20     
     21      // <div class="selector-available">
     22      var selector_available = django.util.quickElement('div', selector_div, '');
     23      selector_available.className = 'selector-available';
     24      django.util.quickElement('h2', selector_available, interpolate(gettext('Available %s'), [field_name]));
     25      var filter_p = django.util.quickElement('p', selector_available, '');
     26      filter_p.className = 'selector-filter';
     27      django.util.quickElement('img', filter_p, '', 'src', admin_media_prefix + 'img/admin/selector-search.gif');
     28      filter_p.appendChild(document.createTextNode(' '));
     29      var filter_input = django.util.quickElement('input', filter_p, '', 'type', 'text');
     30      filter_input.id = field_id + '_input';
     31      selector_available.appendChild(from_box);
     32      var choose_all = django.util.quickElement('a', selector_available, gettext('Choose all'), 'href', 'javascript: (function(){ django.widget.SelectBox.move_all("' + field_id + '_from", "' + field_id + '_to"); })()');
     33      choose_all.className = 'selector-chooseall';
     34     
     35      // <ul class="selector-chooser">
     36      var selector_chooser = django.util.quickElement('ul', selector_div, '');
     37      selector_chooser.className = 'selector-chooser';
     38      var add_link = django.util.quickElement('a', django.util.quickElement('li', selector_chooser, ''), gettext('Add'), 'href', 'javascript: (function(){ django.widget.SelectBox.move("' + field_id + '_from","' + field_id + '_to");})()');
     39      add_link.className = 'selector-add';
     40      var remove_link = django.util.quickElement('a', django.util.quickElement('li', selector_chooser, ''), gettext('Remove'), 'href', 'javascript: (function(){ django.widget.SelectBox.move("' + field_id + '_to","' + field_id + '_from");})()');
     41      remove_link.className = 'selector-remove';
     42     
     43      // <div class="selector-chosen">
     44      var selector_chosen = django.util.quickElement('div', selector_div, '');
     45      selector_chosen.className = 'selector-chosen';
     46      django.util.quickElement('h2', selector_chosen, interpolate(gettext('Chosen %s'), [field_name]));
     47      var selector_filter = django.util.quickElement('p', selector_chosen, gettext('Select your choice(s) and click '));
     48      selector_filter.className = 'selector-filter';
     49      django.util.quickElement('img', selector_filter, '', 'src', admin_media_prefix + 'img/admin/selector-add.gif', 'alt', 'Add');
     50      var to_box = django.util.quickElement('select', selector_chosen, '', 'id', field_id + '_to', 'multiple', 'multiple', 'size', from_box.size, 'name', from_box.getAttribute('name'));
     51      to_box.className = 'filtered';
     52      var clear_all = django.util.quickElement('a', selector_chosen, gettext('Clear all'), 'href', 'javascript: (function() { django.widget.SelectBox.move_all("' + field_id + '_to", "' + field_id + '_from");})()');
     53      clear_all.className = 'selector-clearall';
     54     
     55      from_box.setAttribute('name', from_box.getAttribute('name') + '_old');
     56     
     57      // Set up the JavaScript event handlers for the select box filter interface
     58      django.util.addEvent(filter_input, 'keyup', function(e) { SelectFilter.filter_key_up(e, field_id); });
     59      django.util.addEvent(filter_input, 'keydown', function(e) { SelectFilter.filter_key_down(e, field_id); });
     60      django.util.addEvent(from_box, 'dblclick', function() { django.widget.SelectBox.move(field_id + '_from', field_id + '_to'); });
     61      django.util.addEvent(to_box, 'dblclick', function() { django.widget.SelectBox.move(field_id + '_to', field_id + '_from'); });
     62      django.util.addEvent(django.util.findForm(from_box), 'submit', function() { django.widget.SelectBox.select_all(field_id + '_to'); });
     63      django.widget.SelectBox.init(field_id + '_from');
     64      django.widget.SelectBox.init(field_id + '_to');
     65      // Move selected from_box options to to_box
     66      django.widget.SelectBox.move(field_id + '_from', field_id + '_to');
     67   },
     68   filter_key_up: function(event, field_id) {
     69      from = document.getElementById(field_id + '_from');
     70      // don't submit form if user pressed Enter
     71      if ((event.which && event.which == 13) || (event.keyCode && event.keyCode == 13)) {
     72         from.selectedIndex = 0;
     73         django.widget.SelectBox.move(field_id + '_from', field_id + '_to');
     74         from.selectedIndex = 0;
     75         return false;
     76      }
     77      var temp = from.selectedIndex;
     78      django.widget.SelectBox.filter(field_id + '_from', document.getElementById(field_id + '_input').value);
     79      from.selectedIndex = temp;
     80      return true;
     81   },
     82   filter_key_down: function(event, field_id) {
     83      from = document.getElementById(field_id + '_from');
     84      // right arrow -- move across
     85      if ((event.which && event.which == 39) || (event.keyCode && event.keyCode == 39)) {
     86         var old_index = from.selectedIndex;
     87         django.widget.SelectBox.move(field_id + '_from', field_id + '_to');
     88         from.selectedIndex = (old_index == from.length) ? from.length - 1 : old_index;
     89         return false;
     90      }
     91      // down arrow -- wrap around
     92      if ((event.which && event.which == 40) || (event.keyCode && event.keyCode == 40)) {
     93         from.selectedIndex = (from.length == from.selectedIndex + 1) ? 0 : from.selectedIndex + 1;
     94      }
     95      // up arrow -- wrap around
     96      if ((event.which && event.which == 38) || (event.keyCode && event.keyCode == 38)) {
     97         from.selectedIndex = (from.selectedIndex === 0) ? from.length - 1 : from.selectedIndex - 1;
     98      }
     99      return true;
     100   }
     101};
     102 No newline at end of file
  • media/js/django/widget/SelectBox.js

     
     1dojo.provide('django.widget.SelectBox');
     2
     3django.widget.SelectBox = {
     4   cache: new Object(),
     5   init: function(id) {
     6      var box = document.getElementById(id);
     7      var node;
     8      django.widget.SelectBox.cache[id] = new Array();
     9      var cache = django.widget.SelectBox.cache[id];
     10      for (var i = 0; (node = box.options[i]); i++) {
     11         cache.push({ value: node.value, text: node.text, displayed: 1 });
     12      }
     13   },
     14   redisplay: function(id) {
     15      // Repopulate HTML select box from cache
     16      var box = document.getElementById(id);
     17      box.options.length = 0; // clear all options
     18      for (var i = 0, j = django.widget.SelectBox.cache[id].length; i < j; i++) {
     19         var node = django.widget.SelectBox.cache[id][i];
     20         if (node.displayed) {
     21            box.options[box.options.length] = new Option(node.text, node.value, false, false);
     22         }
     23      }
     24   },
     25   filter: function(id, text) {
     26      // Redisplay the HTML select box, displaying only the choices containing ALL
     27      // the words in text. (It's an AND search.)
     28      var tokens = text.toLowerCase().split(/\s+/);
     29      var node, token;
     30      for (var i = 0; (node = django.widget.SelectBox.cache[id][i]); i++) {
     31         node.displayed = 1;
     32         for (var j = 0; (token = tokens[j]); j++) {
     33            if (node.text.toLowerCase().indexOf(token) == -1) {
     34               node.displayed = 0;
     35            }
     36         }
     37      }
     38      django.widget.SelectBox.redisplay(id);
     39   },
     40    delete_from_cache: function(id, value) {
     41       var node, delete_index = null;
     42       for (var i = 0; (node = django.widget.SelectBox.cache[id][i]); i++) {
     43          if (node.value == value) {
     44             delete_index = i;
     45             break;
     46          }
     47       }
     48       var j = django.widget.SelectBox.cache[id].length - 1;
     49       for (var i = delete_index; i < j; i++) {
     50          django.widget.SelectBox.cache[id][i] = django.widget.SelectBox.cache[id][i+1];
     51       }
     52       django.widget.SelectBox.cache[id].length--;
     53    },
     54   add_to_cache: function(id, option) {
     55      django.widget.SelectBox.cache[id].push({ value: option.value, text: option.text, displayed: 1 });
     56   },
     57   cache_contains: function(id, value) {
     58      // Check if an item is contained in the cache
     59      var node;
     60      for (var i = 0; (node = django.widget.SelectBox.cache[id][i]); i++) {
     61         if (node.value == value) {
     62            return true;
     63         }
     64      }
     65      return false;
     66   },
     67   move: function(from, to) {
     68      var from_box = document.getElementById(from);
     69      var to_box = document.getElementById(to);
     70      var option;
     71      for (var i = 0; (option = from_box.options[i]); i++) {
     72         if (option.selected && django.widget.SelectBox.cache_contains(from, option.value)) {
     73            django.widget.SelectBox.add_to_cache(to, { value: option.value, text: option.text, displayed: 1 });
     74            django.widget.SelectBox.delete_from_cache(from, option.value);
     75         }
     76      }
     77      django.widget.SelectBox.redisplay(from);
     78      django.widget.SelectBox.redisplay(to);
     79   },
     80   move_all: function(from, to) {
     81      var from_box = document.getElementById(from);
     82      var to_box = document.getElementById(to);
     83      var option;
     84      for (var i = 0; (option = from_box.options[i]); i++) {
     85         django.widget.SelectBox.add_to_cache(to, { value: option.value, text: option.text, displayed: 1 });
     86         django.widget.SelectBox.delete_from_cache(from, option.value);
     87      }
     88      django.widget.SelectBox.redisplay(from);
     89      django.widget.SelectBox.redisplay(to);
     90   },
     91   sort: function(id) {
     92      django.widget.SelectBox.cache[id].sort( function(a, b) {
     93          a = a.text.toLowerCase();
     94          b = b.text.toLowerCase();
     95          try {
     96              if (a > b) return 1;
     97              if (a < b) return -1;
     98          }
     99          catch (e) {
     100          // silently fail on IE 'unknown' exception
     101          }
     102          return 0;
     103          });
     104   },
     105   select_all: function(id) {
     106      var box = document.getElementById(id);
     107      for (var i = 0; i < box.options.length; i++) {
     108         box.options[i].selected = 'selected';
     109      }
     110   }
     111};
     112 No newline at end of file
  • media/js/django/widget/DateTime.js

     
     1dojo.provide('django.widget.DateTime');
     2dojo.require('django.datetime.*');
     3
     4// Inserts shortcut buttons after all of the following:
     5//     <input type="text" class="vDateField">
     6//     <input type="text" class="vTimeField">
     7
     8django.widget.DateTime = {
     9   widgetType: 'DjangoDateTime',
     10   calendars: [],
     11   calendarInputs: [],
     12   clockInputs: [],
     13   calendarDivName1: 'calendarbox', // name of calendar <div> that gets toggled
     14   calendarDivName2: 'calendarin',  // name of <div> that contains calendar
     15   clockDivName: 'clockbox',        // name of clock <div> that gets toggled
     16   admin_media_prefix: '',
     17   init: function() {
     18      django.widget.DateTime.admin_media_prefix = admin_media_prefix;
     19     
     20      var inputs = document.getElementsByTagName('input');
     21      for (i=0; i<inputs.length; i++) {
     22         var inp = inputs[i];
     23         if (inp.getAttribute('type') == 'text' && inp.className.match(/vTimeField/)) {
     24            django.widget.DateTime.addClock(inp);
     25         }
     26         else if (inp.getAttribute('type') == 'text' && inp.className.match(/vDateField/)) {
     27            django.widget.DateTime.addCalendar(inp);
     28         }
     29      }
     30   },
     31   // Add clock widget to a given field
     32   addClock: function(inp) {
     33      var num = django.widget.DateTime.clockInputs.length;
     34      django.widget.DateTime.clockInputs[num] = inp;
     35     
     36      // Shortcut links (clock icon and "Now" link)
     37      var shortcuts_span = document.createElement('span');
     38      inp.parentNode.insertBefore(shortcuts_span, inp.nextSibling);
     39      var now_link = document.createElement('a');
     40      now_link.setAttribute('href', "javascript:django.widget.DateTime.handleClockQuicklink(" + num + ", django.datetime.getHourMinute(new Date()));");
     41      now_link.appendChild(document.createTextNode(gettext('Now')));
     42      var clock_link = document.createElement('a');
     43      clock_link.setAttribute('href', 'javascript:django.widget.DateTime.openClock(' + num + ');');
     44      django.util.quickElement('img', clock_link, '', 'src', django.widget.DateTime.admin_media_prefix + 'img/admin/icon_clock.gif', 'alt', gettext('Clock'));
     45      shortcuts_span.appendChild(document.createTextNode('\240'));
     46      shortcuts_span.appendChild(now_link);
     47      shortcuts_span.appendChild(document.createTextNode('\240|\240'));
     48      shortcuts_span.appendChild(clock_link);
     49     
     50      // Create clock link div
     51      //
     52      // Markup looks like:
     53      // <div id="clockbox1" class="clockbox module">
     54      //     <h2>Choose a time</h2>
     55      //     <ul class="timelist">
     56      //         <li><a href="#">Now</a></li>
     57      //         <li><a href="#">Midnight</a></li>
     58      //         <li><a href="#">6 a.m.</a></li>
     59      //         <li><a href="#">Noon</a></li>
     60      //     </ul>
     61      //     <p class="calendar-cancel"><a href="#">Cancel</a></p>
     62      // </div>
     63     
     64      var clock_box = document.createElement('div');
     65      clock_box.style.display = 'none';
     66      clock_box.style.position = 'absolute';
     67      clock_box.style.left = django.util.findPosX(clock_link) + 17 + 'px';
     68      clock_box.style.top = django.util.findPosY(clock_link) - 30 + 'px';
     69      clock_box.className = 'clockbox module';
     70      clock_box.setAttribute('id', django.widget.DateTime.clockDivName + num);
     71      document.body.appendChild(clock_box);
     72      django.util.addEvent(clock_box, 'click', django.widget.DateTime.cancelEventPropagation);
     73     
     74      django.util.quickElement('h2', clock_box, gettext('Choose a time'));
     75      time_list = django.util.quickElement('ul', clock_box, '');
     76      time_list.className = 'timelist';
     77      django.util.quickElement("a", django.util.quickElement("li", time_list, ""), gettext("Now"), "href", "javascript:django.widget.DateTime.handleClockQuicklink(" + num + ", django.datetime.getHourMinute(new Date()));")
     78      django.util.quickElement("a", django.util.quickElement("li", time_list, ""), gettext("Midnight"), "href", "javascript:django.widget.DateTime.handleClockQuicklink(" + num + ", '00:00');")
     79      django.util.quickElement("a", django.util.quickElement("li", time_list, ""), gettext("6 a.m."), "href", "javascript:django.widget.DateTime.handleClockQuicklink(" + num + ", '06:00');")
     80      django.util.quickElement("a", django.util.quickElement("li", time_list, ""), gettext("Noon"), "href", "javascript:django.widget.DateTime.handleClockQuicklink(" + num + ", '12:00');")
     81     
     82      cancel_p = django.util.quickElement('p', clock_box, '');
     83      cancel_p.className = 'calendar-cancel';
     84      django.util.quickElement('a', cancel_p, gettext('Cancel'), 'href', 'javascript:django.widget.DateTime.dismissClock(' + num + ');');
     85   },
     86   openClock: function(num) {
     87      document.getElementById(django.widget.DateTime.clockDivName + num).style.display = 'block';
     88      django.util.addEvent(window, 'click', function() { django.widget.DateTime.dismissClock(num); return true; });
     89   },
     90   dismissClock: function(num) {
     91      document.getElementById(django.widget.DateTime.clockDivName + num).style.display = 'none';
     92      window.onclick = null;
     93   },
     94   handleClockQuicklink: function(num, val) {
     95      django.widget.DateTime.clockInputs[num].value = val;
     96      django.widget.DateTime.dismissClock(num);
     97   },
     98   // Add calendar widget to a given field.
     99   addCalendar: function(inp) {
     100      var num = django.widget.DateTime.calendars.length;
     101     
     102      django.widget.DateTime.calendarInputs[num] = inp;
     103     
     104      // Shortcut links (calendar icon and "Today" link)
     105      var shortcuts_span = document.createElement('span');
     106      inp.parentNode.insertBefore(shortcuts_span, inp.nextSibling);
     107      var today_link = document.createElement('a');
     108      today_link.setAttribute('href', 'javascript:django.widget.DateTime.handleCalendarQuickLink(' + num + ', 0);');
     109      today_link.appendChild(document.createTextNode(gettext('Today')));
     110      var cal_link = document.createElement('a');
     111      cal_link.setAttribute('href', 'javascript:django.widget.DateTime.openCalendar(' + num + ');');
     112      django.util.quickElement('img', cal_link, '', 'src', django.widget.DateTime.admin_media_prefix + 'img/admin/icon_calendar.gif', 'alt', gettext('Calendar'));
     113      shortcuts_span.appendChild(document.createTextNode('\240'));
     114      shortcuts_span.appendChild(today_link);
     115      shortcuts_span.appendChild(document.createTextNode('\240|\240'));
     116      shortcuts_span.appendChild(cal_link);
     117     
     118      // Create calendarbox div.
     119      //
     120      // Markup looks like:
     121      //
     122      // <div id="calendarbox3" class="calendarbox module">
     123      //     <h2>
     124      //           <a href="#" class="link-previous">&lsaquo;</a>
     125      //           <a href="#" class="link-next">&rsaquo;</a> February 2003
     126      //     </h2>
     127      //     <div class="calendar" id="calendarin3">
     128      //         <!-- (cal) -->
     129      //     </div>
     130      //     <div class="calendar-shortcuts">
     131      //          <a href="#">Yesterday</a> | <a href="#">Today</a> | <a href="#">Tomorrow</a>
     132      //     </div>
     133      //     <p class="calendar-cancel"><a href="#">Cancel</a></p>
     134      // </div>
     135      var cal_box = document.createElement('div');
     136      cal_box.style.display = 'none';
     137      cal_box.style.position = 'absolute';
     138      cal_box.style.left = django.util.findPosX(cal_link) + 17 + 'px';
     139      cal_box.style.top = django.util.findPosY(cal_link) - 75 + 'px';
     140      cal_box.className = 'calendarbox module';
     141      cal_box.setAttribute('id', django.widget.DateTime.calendarDivName1 + num);
     142      document.body.appendChild(cal_box);
     143      django.util.addEvent(cal_box, 'click', django.widget.DateTime.cancelEventPropagation);
     144     
     145      // next-prev links
     146      var cal_nav = django.util.quickElement('div', cal_box, '');
     147      var cal_nav_prev = django.util.quickElement('a', cal_nav, '<', 'href', 'javascript:django.widget.DateTime.drawPrev('+num+');');
     148      cal_nav_prev.className = 'calendarnav-previous';
     149      var cal_nav_next = django.util.quickElement('a', cal_nav, '>', 'href', 'javascript:django.widget.DateTime.drawNext('+num+');');
     150      cal_nav_next.className = 'calendarnav-next';
     151      cal_box.appendChild(cal_nav);
     152     
     153      // main box
     154      var cal_main = django.util.quickElement('div', cal_box, '', 'id', django.widget.DateTime.calendarDivName2 + num);
     155      cal_main.className = 'calendar';
     156      django.widget.DateTime.calendars[num] = new django.datetime.calendar.Calendar(django.widget.DateTime.calendarDivName2 + num, django.widget.DateTime.handleCalendarCallback(num));
     157      django.widget.DateTime.calendars[num].drawCurrent();
     158     
     159      // calendar shortcuts
     160      var shortcuts = django.util.quickElement('div', cal_box, '');
     161      shortcuts.className = 'calendar-shortcuts';
     162      django.util.quickElement('a', shortcuts, gettext('Yesterday'), 'href', 'javascript:django.widget.DateTime.handleCalendarQuickLink(' + num + ', -1);');
     163      shortcuts.appendChild(document.createTextNode('\240|\240'));
     164      django.util.quickElement('a', shortcuts, gettext('Today'), 'href', 'javascript:django.widget.DateTime.handleCalendarQuickLink(' + num + ', 0);');
     165      shortcuts.appendChild(document.createTextNode('\240|\240'));
     166      django.util.quickElement('a', shortcuts, gettext('Tomorrow'), 'href', 'javascript:django.widget.DateTime.handleCalendarQuickLink(' + num + ', +1);');
     167     
     168      // cancel bar
     169      var cancel_p = django.util.quickElement('p', cal_box, '');
     170      cancel_p.className = 'calendar-cancel';
     171      django.util.quickElement('a', cancel_p, gettext('Cancel'), 'href', 'javascript:django.widget.DateTime.dismissCalendar(' + num + ');');
     172   },
     173   openCalendar: function(num) {
     174      document.getElementById(django.widget.DateTime.calendarDivName1+num).style.display = 'block';
     175      django.util.addEvent(window, 'click', function() { django.widget.DateTime.dismissCalendar(num); return true; });
     176   },
     177   dismissCalendar: function(num) {
     178      document.getElementById(django.widget.DateTime.calendarDivName1+num).style.display = 'none';
     179   },
     180   drawPrev: function(num) {
     181      django.widget.DateTime.calendars[num].drawPreviousMonth();
     182   },
     183   drawNext: function(num) {
     184      django.widget.DateTime.calendars[num].drawNextMonth();
     185   },
     186   handleCalendarCallback: function(num) {
     187      return "function(y, m, d) { django.widget.DateTime.calendarInputs["+num+"].value = y+'-'+m+'-'+d; document.getElementById(django.widget.DateTime.calendarDivName1+"+num+").style.display='none';}";
     188   },
     189   handleCalendarQuickLink: function(num, offset) {
     190      var d = new Date();
     191      d.setDate(d.getDate() + offset)
     192      django.widget.DateTime.calendarInputs[num].value = django.datetime.getISODate(d);
     193      django.widget.DateTime.dismissCalendar(num);
     194   },
     195   cancelEventPropagation: function(e) {
     196      if (!e) var e = window.event;
     197      e.cancelBubble = true;
     198      if (e.stopPropagation) e.stopPropagation();
     199   }
     200};
     201
     202dojo.addOnLoad(django.widget.DateTime.init);
     203 No newline at end of file
  • media/js/django/datetime.js

     
     1dojo.provide('django.datetime');
     2
     3django.datetime = {
     4   getCorrectYear: function(date) {
     5      // Date.getYear() is unreliable --
     6      // see http://www.quirksmode.org/js/introdate.html#year
     7      var y = date.getYear() % 100;
     8      return (y < 38) ? y + 2000 : y + 1900;
     9   },
     10
     11   getTwoDigitMonth: function(date) {
     12      return (date.getMonth() < 9) ? '0' + (date.getMonth()+1) : (date.getMonth()+1);
     13   },
     14
     15   getTwoDigitDate: function(date) {
     16      return (date.getDate() < 10) ? '0' + date.getDate() : date.getDate();
     17   },
     18
     19   getTwoDigitMinute: function(date) {
     20      return (date.getMinutes() < 10) ? '0' + date.getMinutes() : date.getMinutes();
     21   },
     22
     23   getTwoDigitHour: function(date) {
     24      return (date.getHours() < 10) ? '0' + date.getHours() : date.getHours();
     25   },
     26
     27   getISODate: function(date) {
     28      return django.datetime.getCorrectYear(date) + '-' + django.datetime.getTwoDigitMonth(date) + '-' + django.datetime.getTwoDigitDate(date);
     29   },
     30
     31   getHourMinute: function(date) {
     32      return django.datetime.getTwoDigitHour(date) + ':' + django.datetime.getTwoDigitMinute(date);
     33   },
     34
     35   monthNames: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],
     36
     37   weekdayNames: ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'],
     38
     39   weekdayInitials: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],
     40
     41   parseToNum: function(english) {
     42      var dateTypeInfo = (english.match(/day$/)) ? {'array': django.datetime.weekdayNames, 'type': 'weekday'} : {'array': django.datetime.monthNames, 'type': 'weekday'};
     43
     44      var matches = dateTypeInfo['array'].filter(function(item) {
     45         return new RegExp("^" + english, "i").test(item);
     46      })
     47
     48      if(matches.length == 0) {
     49         var errString = 'Invalid ' + dateTypeInfo['type'] + ' string';
     50         throw new Error(errString);
     51      }
     52
     53      if(matches.length > 1) {
     54         var errString = 'Ambiguous ' + dateTypeInfo['type'];
     55         throw new Error(errString);
     56      }
     57
     58      return dateTypeInfo['array'].indexOf(matches[0]);
     59   },
     60
     61   dateParsePatterns: [
     62      // Today
     63      {   re: /^tod/i,
     64          handler: function() {
     65             return new Date();
     66          }
     67      },
     68      // Tomorrow
     69      {   re: /^tom/i,
     70          handler: function() {
     71             var d = new Date();
     72             d.setDate(d.getDate() + 1);
     73             return d;
     74          }
     75      },
     76      // Yesterday
     77      {   re: /^yes/i,
     78          handler: function() {
     79             var d = new Date();
     80             d.setDate(d.getDate() - 1);
     81             return d;
     82          }
     83      },
     84      // 4th
     85      {   re: /^(\d{1,2})(st|nd|rd|th)?$/i,
     86          handler: function(bits) {
     87             var d = new Date();
     88             d.setDate(parseInt(bits[1], 10));
     89             return d;
     90          }
     91      },
     92      // 4th Jan
     93      {   re: /^(\d{1,2})(?:st|nd|rd|th)? (\w+)$/i,
     94          handler: function(bits) {
     95             var d = new Date();
     96             d.setDate(parseInt(bits[1], 10));
     97             d.setMonth(parseToNum(bits[2]));
     98             return d;
     99          }
     100      },
     101      // 4th Jan 2003
     102      {   re: /^(\d{1,2})(?:st|nd|rd|th)? (\w+),? (\d{4})$/i,
     103          handler: function(bits) {
     104             var d = new Date();
     105             d.setDate(parseInt(bits[1], 10));
     106             d.setMonth(parseToNum(bits[2]));
     107             d.setYear(bits[3]);
     108             return d;
     109          }
     110      },
     111      // Jan 4th
     112      {   re: /^(\w+) (\d{1,2})(?:st|nd|rd|th)?$/i,
     113          handler: function(bits) {
     114             var d = new Date();
     115             d.setDate(parseInt(bits[2], 10));
     116             d.setMonth(parseToNum(bits[1]));
     117             return d;
     118          }
     119      },
     120      // Jan 4th 2003
     121      {   re: /^(\d{1,2})(?:st|nd|rd|th)? (?:of )?(\w+),? (\d{4})$/i,
     122          handler: function(bits) {
     123             var d = new Date();
     124             d.setDate(parseInt(bits[2], 10));
     125             d.setMonth(parseToNum(bits[1]));
     126             d.setYear(bits[3]);
     127             return d;
     128          }
     129      },
     130      // next Tuesday - this is suspect due to weird meaning of "next"
     131      {   re: /^next (\w+)$/i,
     132          handler: function(bits) {
     133             var d = new Date();
     134             var day = d.getDay();
     135             var newDay = parseToNum(bits[1]);
     136             var addDays = newDay - day;
     137             if (newDay <= day) {
     138                addDays += 7;
     139             }
     140             d.setDate(d.getDate() + addDays);
     141             return d;
     142          }
     143      },
     144      // last Tuesday
     145      {   re: /^last (\w+)$/i,
     146          handler: function(bits) {
     147             throw new Error("Not yet implemented");
     148          }
     149      },
     150      // mm/dd/yyyy (American style)
     151      {   re: /(\d{1,2})\/(\d{1,2})\/(\d{4})/,
     152          handler: function(bits) {
     153             var d = new Date();
     154             d.setYear(bits[3]);
     155             d.setDate(parseInt(bits[2], 10));
     156             d.setMonth(parseInt(bits[1], 10) - 1); // Because months indexed from 0
     157             return d;
     158          }
     159      },
     160      // yyyy-mm-dd (ISO style)
     161      {   re: /(\d{4})-(\d{1,2})-(\d{1,2})/,
     162          handler: function(bits) {
     163             var d = new Date();
     164             d.setYear(parseInt(bits[1]));
     165             d.setDate(parseInt(bits[3], 10));
     166             d.setMonth(parseInt(bits[2], 10) - 1);
     167             return d;
     168          }
     169      },
     170   ],
     171   
     172   parseDateString: function(s) {
     173      for (var i = 0; i < django.datetime.dateParsePatterns.length; i++) {
     174         var re = django.datetime.dateParsePatterns[i].re;
     175         var handler = django.datetime.dateParsePatterns[i].handler;
     176         var bits = re.exec(s);
     177         if (bits) {
     178            return handler(bits);
     179         }
     180      }
     181      throw new Error("Invalid date string");
     182   },
     183   
     184   fmt00: function(x) {
     185      // fmt00: Tags leading zero onto numbers 0 - 9.
     186      // Particularly useful for displaying results from Date methods.
     187      //
     188      if (Math.abs(parseInt(x)) < 10){
     189         x = "0"+ Math.abs(x);
     190      }
     191      return x;
     192   },
     193   
     194   parseDateStringISO: function(s) {
     195      try {
     196         var d = django.datetime.parseDateString(s);
     197         return d.getFullYear() + '-' + (django.datetime.fmt00(d.getMonth() + 1)) + '-' + django.datetime.fmt00(d.getDate())
     198      }
     199      catch (e) { return s; }
     200   },
     201   
     202   magicDate: function(input) {
     203      var messagespan = input.id + 'Msg';
     204      try {
     205         var d = django.datetime.parseDateString(input.value);
     206         input.value = d.getFullYear() + '-' + (django.datetime.fmt00(d.getMonth() + 1)) + '-' +
     207            django.datetime.fmt00(d.getDate());
     208         input.className = '';
     209         // Human readable date
     210         if (document.getElementById(messagespan)) {
     211            document.getElementById(messagespan).firstChild.nodeValue = d.toDateString();
     212            document.getElementById(messagespan).className = 'normal';
     213         }
     214      }
     215      catch (e) {
     216         input.className = 'error';
     217         var message = e.message;
     218         // Fix for IE6 bug
     219         if (message.indexOf('is null or not an object') > -1) {
     220            message = 'Invalid date string';
     221         }
     222         if (document.getElementById(messagespan)) {
     223            document.getElementById(messagespan).firstChild.nodeValue = message;
     224            document.getElementById(messagespan).className = 'error';
     225         }
     226      }
     227   },
     228   
     229   timeParsePatterns: [
     230      // 9
     231      {   re: /^\d{1,2}$/i,
     232          handler: function(bits) {
     233             if (bits[0].length == 1) {
     234                return '0' + bits[0] + ':00';
     235             } else {
     236                return bits[0] + ':00';
     237             }
     238          }
     239      },
     240      // 13:00
     241      {   re: /^\d{2}[:.]\d{2}$/i,
     242          handler: function(bits) {
     243             return bits[0].replace('.', ':');
     244          }
     245      },
     246      // 9:00
     247      {   re: /^\d[:.]\d{2}$/i,
     248          handler: function(bits) {
     249             return '0' + bits[0].replace('.', ':');
     250          }
     251      },
     252      // 3 am / 3 a.m. / 3am
     253      {   re: /^(\d+)\s*([ap])(?:.?m.?)?$/i,
     254          handler: function(bits) {
     255             var hour = parseInt(bits[1]);
     256             if (hour == 12) {
     257                hour = 0;
     258             }
     259             if (bits[2].toLowerCase() == 'p') {
     260                if (hour == 12) {
     261                   hour = 0;
     262                }
     263                return (hour + 12) + ':00';
     264             } else {
     265                if (hour < 10) {
     266                   return '0' + hour + ':00';
     267                } else {
     268                   return hour + ':00';
     269                }
     270             }
     271          }
     272      },
     273      // 3.30 am / 3:15 a.m. / 3.00am
     274      {   re: /^(\d+)[.:](\d{2})\s*([ap]).?m.?$/i,
     275          handler: function(bits) {
     276             var hour = parseInt(bits[1]);
     277             var mins = parseInt(bits[2]);
     278             if (mins < 10) {
     279                mins = '0' + mins;
     280             }
     281             if (hour == 12) {
     282                hour = 0;
     283             }
     284             if (bits[3].toLowerCase() == 'p') {
     285                if (hour == 12) {
     286                   hour = 0;
     287                }
     288                return (hour + 12) + ':' + mins;
     289             } else {
     290                if (hour < 10) {
     291                   return '0' + hour + ':' + mins;
     292                } else {
     293                   return hour + ':' + mins;
     294                }
     295             }
     296          }
     297      },
     298      // noon
     299      {   re: /^no/i,
     300          handler: function(bits) {
     301             return '12:00';
     302          }
     303      },
     304      // midnight
     305      {   re: /^mid/i,
     306          handler: function(bits) {
     307             return '00:00';
     308          }
     309      }
     310   ],
     311   
     312   parseTimeString: function(s) {
     313      for (var i = 0; i < timeParsePatterns.length; i++) {
     314         var re = timeParsePatterns[i].re;
     315         var handler = timeParsePatterns[i].handler;
     316         var bits = re.exec(s);
     317         if (bits) {
     318            return handler(bits);
     319         }
     320      }
     321      return s;
     322   }   
     323};
     324 No newline at end of file
  • media/js/django/util.js

     
     1dojo.provide('django.util');
     2
     3django.util = {
     4   URLify: function(s, num_chars) {
     5      // changes, e.g., "Petty theft" to "petty_theft"
     6      // remove all these words from the string before urlifying
     7      removelist = ["a", "an", "as", "at", "before", "but", "by", "for", "from",
     8                    "is", "in", "into", "like", "of", "off", "on", "onto", "per",
     9                    "since", "than", "the", "this", "that", "to", "up", "via",
     10                    "with"];
     11      r = new RegExp('\\b(' + removelist.join('|') + ')\\b', 'gi');
     12      s = s.replace(r, '');
     13      s = s.replace(/[^-A-Z0-9\s]/gi, '');  // remove unneeded chars
     14      s = s.replace(/^\s+|\s+$/g, ''); // trim leading/trailing spaces
     15      s = s.replace(/\s+/g, '-');      // convert spaces to hyphens
     16      s = s.toLowerCase();             // convert to lowercase
     17      return s.substring(0, num_chars);// trim to first num_chars chars
     18   },
     19   
     20   findForm: function(node) {
     21      // returns the node of the form containing the given node
     22      if (node.tagName.toLowerCase() != 'form') {
     23         return django.util.findForm(node.parentNode);
     24      }
     25      return node;
     26   },
     27   
     28   quickElement: function() {
     29      var obj = document.createElement(arguments[0]);
     30      if (arguments[2] != '' && arguments[2] != null) {
     31         var textNode = document.createTextNode(arguments[2]);
     32         obj.appendChild(textNode);
     33      }
     34      var len = arguments.length;
     35      for (var i = 3; i < len; i += 2) {
     36         obj.setAttribute(arguments[i], arguments[i+1]);
     37      }
     38      arguments[1].appendChild(obj);
     39      return obj;
     40   },
     41   
     42   removeChildren: function(a) { // "a" is reference to an object
     43      while (a.hasChildNodes()) a.removeChild(a.lastChild);
     44   },
     45   
     46   findPosX: function(obj) {
     47      var curleft = 0;
     48      if (obj.offsetParent) {
     49         while (obj.offsetParent) {
     50            curleft += obj.offsetLeft;
     51            obj = obj.offsetParent;
     52         }
     53      } else if (obj.x) {
     54         curleft += obj.x;
     55      }
     56      return curleft;
     57   },
     58   
     59   findPosY: function(obj) {
     60      var curtop = 0;
     61      if (obj.offsetParent) {
     62         while (obj.offsetParent) {
     63            curtop += obj.offsetTop;
     64            obj = obj.offsetParent;
     65         }
     66      } else if (obj.y) {
     67         curtop += obj.y;
     68      }
     69      return curtop;
     70   },
     71   
     72   addEvent: function(obj, type, fn) {
     73      /* John Resig's addEvent, with modifications by Peter-Paul Koch.
     74         * See http://www.quirksmode.org/blog/archives/2005/10/_and_the_winner_1.html
     75         */
     76      if (obj.addEventListener) {
     77         obj.addEventListener( type, fn, false );
     78      }
     79      else if (obj.attachEvent) {
     80         obj["e"+type+fn] = fn;
     81         obj[type+fn] = function() { obj["e"+type+fn]( window.event ); }
     82         obj.attachEvent("on"+type, obj[type+fn]);
     83      }
     84   },
     85
     86    removeEvent: function(obj, evType, fn) {
     87       if (obj.removeEventListener) {
     88          obj.removeEventListener(evType, fn, false);
     89          return true;
     90       } else if (obj.detachEvent) {
     91          obj.detachEvent("on" + evType, fn);
     92       } else {
     93          return false;
     94       }
     95    }
     96};
     97 No newline at end of file
  • media/js/django/admin/__package__.js

     
     1dojo.hostenv.conditionalLoadModule({
     2        common: [
     3                "django.admin",
     4                "django.admin.CollapsedFieldsets",
     5                "django.admin.AutoPopulate",
     6                "django.admin.RelatedLookups"
     7        ]
     8});
     9dojo.hostenv.moduleLoaded("django.admin.*");
  • media/js/django/admin/CollapsedFieldsets.js

     
     1dojo.provide('django.admin.CollapsedFieldsets');
     2dojo.require('dojo.event');
     3dojo.require('django.util');
     4
     5// Finds all fieldsets with class="collapse", collapses them, and gives each
     6// one a "Show" link that uncollapses it. The "Show" link becomes a "Hide"
     7// link when the fieldset is visible.
     8
     9
     10django.admin.CollapsedFieldsets = {
     11   collapse_re: /\bcollapse\b/,   // Class of fieldsets that should be dealt with.
     12   collapsed_re: /\bcollapsed\b/, // Class that fieldsets get when they're hidden.
     13   collapsed_class: 'collapsed',
     14   init: function() {
     15      var fieldsets = document.getElementsByTagName('fieldset');
     16      var collapsed_seen = false;
     17      for (var i=0; i<fieldsets.length; i++) {
     18         // Collapse this fieldset if it has the correct class, and if it
     19         // doesn't have any errors. (Collapsing shouldn't apply in the case
     20         // of error messages.)
     21         var fs = fieldsets[i];
     22         if (fs.className.match(django.admin.CollapsedFieldsets.collapse_re) && !django.admin.CollapsedFieldsets.fieldset_has_errors(fs)) {
     23            collapsed_seen = true;
     24            // Give it an additional class, used by CSS to hide it.
     25            fs.className += ' ' + django.admin.CollapsedFieldsets.collapsed_class;
     26            // (<a id="fieldsetcollapser3" class="collapse-toggle" href="#">Show</a>)
     27            var collapse_link = document.createElement('a');
     28            collapse_link.className = 'collapse-toggle';
     29            collapse_link.id = 'fieldsetcollapser' + i;
     30            collapse_link.onclick = new Function('django.admin.CollapsedFieldsets.show('+i+'); return false;');
     31            collapse_link.href = '#';
     32            collapse_link.innerHTML = 'Show';
     33            var h2 = fs.getElementsByTagName('h2')[0];
     34            h2.appendChild(document.createTextNode(' ('));
     35            h2.appendChild(collapse_link);
     36            h2.appendChild(document.createTextNode(')'));
     37         }
     38         if (collapsed_seen) {
     39            // Expand all collapsed fieldsets when form is submitted.
     40            dojo.event.connect(django.util.findForm(document.getElementsByTagName('fieldset')[0]), 'onsubmit', function() { django.admin.CollapsedFieldsets.uncollapse_all(); });
     41         }
     42      }
     43   },
     44
     45   fieldset_has_errors: function(fs) {
     46      // Returns true if any fields in the fieldset have validation errors.
     47      var divs = fs.getElementsByTagName('div');
     48      for (var i=0; i<divs.length; i++) {
     49         if (divs[i].className.match(/\berror\b/)) {
     50            return true;
     51         }
     52      }
     53      return false;
     54   },
     55   
     56   show: function(fieldset_index) {
     57      var fs = document.getElementsByTagName('fieldset')[fieldset_index];
     58      // Remove the class name that causes the "display: none".
     59      fs.className = fs.className.replace(django.admin.CollapsedFieldsets.collapsed_re, '');
     60      // Toggle the "Show" link to a "Hide" link
     61      var collapse_link = document.getElementById('fieldsetcollapser' + fieldset_index);
     62      collapse_link.onclick = new Function('django.admin.CollapsedFieldsets.hide('+fieldset_index+'); return false;');
     63      collapse_link.innerHTML = 'Hide';
     64   },
     65     
     66   hide: function(fieldset_index) {
     67      var fs = document.getElementsByTagName('fieldset')[fieldset_index];
     68      // Add the class name that causes the "display: none".
     69      fs.className += ' ' + django.admin.CollapsedFieldsets.collapsed_class;
     70      // Toggle the "Hide" link to a "Show" link
     71      var collapse_link = document.getElementById('fieldsetcollapser' + fieldset_index);
     72      collapse_link.onclick = new Function('django.admin.CollapsedFieldsets.show('+fieldset_index+'); return false;');
     73      collapse_link.innerHTML = 'Show';
     74   },
     75     
     76   uncollapse_all: function() {
     77      var fieldsets = document.getElementsByTagName('fieldset');
     78      for (var i=0; i<fieldsets.length; i++) {
     79         if (fieldsets[i].className.match(django.admin.CollapsedFieldsets.collapsed_re)) {
     80            django.admin.CollapsedFieldsets.show(i);
     81         }
     82      }
     83   }
     84};
     85
     86
     87dojo.addOnLoad(django.admin.CollapsedFieldsets.init);
  • media/js/django/admin/RelatedLookups.js

     
     1dojo.provide('django.admin.RelatedLookups');
     2dojo.require('dojo.event.*');
     3
     4django.admin.RelatedLookups = {
     5   relatedPopups: {},
     6   addPopups: {},
     7   
     8   createRelatedHandler: function(elem) {
     9      return function(evt) {
     10         var href = django.admin.RelatedLookups.relatedPopups[elem.id];
     11         var name = elem.id.replace(/^lookup_/, '').replace(/\./g, '___');
     12         win = window.open(href + '?_popup=1', name, 'height=500,width=800,resizable=yes,scrollbars=yes');
     13         win.focus();
     14      }
     15   },
     16
     17   createAddHandler: function(elem) {
     18      return function(evt) {
     19         var href = django.admin.RelatedLookups.addPopups[elem.id];
     20         var name = elem.id.replace(/^add_/, '').replace(/\./g, '___');
     21         win = window.open(href + '?_popup=1', name, 'height=500,width=800,resizable=yes,scrollbars=yes');
     22         win.focus();
     23      }
     24   },
     25   
     26   init: function() {
     27      var links = document.getElementsByTagName('a');
     28      var num_links = links.length;
     29      for(var i=0; i<num_links; i++) {
     30         if(links[i].className.indexOf('related-lookup') != -1) {
     31            django.admin.RelatedLookups.relatedPopups[links[i].id] = links[i].href;
     32            links[i].href = 'javascript:void(0)'; //This is easier than trying to make preventDefault work in Safari.
     33            dojo.event.connect(links[i], 'onclick', django.admin.RelatedLookups.createRelatedHandler(links[i]));
     34         } else if(links[i].className.indexOf('add-another') != -1) {
     35            django.admin.RelatedLookups.addPopups[links[i].id] = links[i].href;
     36            links[i].href = 'javascript:void(0)';
     37            dojo.event.connect(links[i], 'onclick', django.admin.RelatedLookups.createAddHandler(links[i]));
     38         }
     39      }
     40   },
     41   
     42   dismissRelatedLookupPopup: function(win, chosenId) {
     43      var elem = document.getElementById(win.name);
     44      if (elem.className.indexOf('vRawIdAdminField') != -1 && elem.value) {
     45         elem.value += ',' + chosenId;
     46      } else {
     47         document.getElementById(win.name).value = chosenId;
     48      }
     49      win.close();
     50   },
     51   
     52   dismissAddAnotherPopup: function(win, newId, newRepr) {
     53      var name = win.name.replace(/___/g, '.');
     54      var elem = document.getElementById(name);
     55      if (elem) {
     56         if (elem.nodeName == 'SELECT') {
     57            var o = new Option(newRepr, newId);
     58            elem.options[elem.options.length] = o;
     59            elem.selectedIndex = elem.length - 1;
     60         } else if (elem.nodeName == 'INPUT') {
     61            elem.value = newId;
     62         }
     63      } else {
     64         var toId = name + "_to";
     65         elem = document.getElementById(toId);
     66         var o = new Option(newRepr, newId);
     67         django.widget.SelectBox.add_to_cache(toId, o);
     68         django.widget.SelectBox.redisplay(toId);
     69      }
     70      win.close();
     71   }
     72}
     73 No newline at end of file
  • media/js/django/admin/AutoPopulate.js

     
     1dojo.provide('django.admin.AutoPopulate');
     2dojo.require('dojo.event.*');
     3
     4django.admin.AutoPopulate = {
     5   createHandler: function(elem) {
     6      return function(evt) {
     7         var destFields = django.admin.AutoPopulate.sourceIndexedArray[elem.id];
     8         var num_dests = destFields.length;
     9         for(var i=0; i<num_dests; i++) {
     10            var destField = document.getElementById(destFields[i]);
     11            if(!destField.className.indexOf('changed') != 1) {
     12               var sources = django.admin.AutoPopulate.destIndexedArray[destFields[i]];
     13               var num_sources = sources.length;
     14               var newValues = '';
     15               for(var j=0; j<num_sources; j++) {
     16                  newValues += document.getElementById(sources[j]).value + " ";
     17               }
     18               destField.value = django.util.URLify(newValues, 250);
     19            }
     20         }
     21      }
     22   },
     23
     24   init: function(auto_populate_array) {
     25      django.admin.AutoPopulate.sourceIndexedArray = {};
     26      django.admin.AutoPopulate.destIndexedArray = auto_populate_array;
     27      var num_dests = django.admin.AutoPopulate.destIndexedArray.length;
     28      for(var destField in django.admin.AutoPopulate.destIndexedArray) {
     29         dojo.event.connect(document.getElementById(destField), "onchange", function(evt) {
     30                               document.getElementById(destField).className += " changed";
     31                            });
     32         var sources = django.admin.AutoPopulate.destIndexedArray[destField];
     33         var num_sources = sources.length;
     34         for(var i=0; i<num_sources; i++) {
     35            var sourceField = document.getElementById(sources[i]);
     36            if(typeof(django.admin.AutoPopulate.sourceIndexedArray[sources[i]] == 'undefined')) {
     37               django.admin.AutoPopulate.sourceIndexedArray[sources[i]] = [destField];
     38            } else {
     39               django.admin.AutoPopulate.sourceIndexedArray[sources[i]].push(destField);
     40            }
     41            var handler = django.admin.AutoPopulate.createHandler(document.getElementById(sources[i]));
     42            dojo.event.connect(sourceField, "onkeyup", handler);
     43         }
     44      }
     45   }   
     46}
     47 No newline at end of file
  • media/js/django/datetime/__package__.js

     
     1dojo.hostenv.conditionalLoadModule({
     2    common: [
     3        "django.datetime",
     4        "django.datetime.calendar"
     5    ]
     6});
     7dojo.hostenv.moduleLoaded("django.calendar.*");
  • media/js/django/datetime/calendar.js

     
     1dojo.provide('django.datetime.calendar');
     2dojo.require('django.datetime');
     3dojo.require('django.util');
     4
     5django.datetime.calendar = {
     6   /*
     7     calendar.js - Calendar functions by Adrian Holovaty
     8    */
     9   
     10   // CalendarNamespace -- Provides a collection of HTML calendar-related helper functions
     11   CalendarNamespace: {
     12      isLeapYear: function(year) {
     13         return (((year % 4)==0) && ((year % 100)!=0) || ((year % 400)==0));
     14      },
     15     
     16      getDaysInMonth: function(month, year) {
     17         var days = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
     18         if (month == 1 && django.datetime.calendar.CalendarNamespace.isLeapYear(year)) { return 29; }
     19         else { return days[month]; }
     20      },
     21     
     22      draw: function(month, year, div_id, callback) { // month = 1-12, year = 1-9999
     23         month = parseInt(month);
     24         year = parseInt(year);
     25         var calDiv = document.getElementById(div_id);
     26         django.util.removeChildren(calDiv);
     27         var calTable = document.createElement('table');
     28         django.util.quickElement('caption', calTable, django.datetime.monthNames[month-1] + ' ' + year);
     29         var tableBody = django.util.quickElement('tbody', calTable);
     30         
     31         // Draw days-of-week header
     32         var tableRow = django.util.quickElement('tr', tableBody);
     33         for (var i = 0; i < 7; i++) {
     34            django.util.quickElement('th', tableRow, django.datetime.weekdayInitials[i]);
     35         }
     36         
     37         var startingPos = new Date(year, month, 1).getDay();
     38         var days = django.datetime.calendar.CalendarNamespace.getDaysInMonth(month - 1, year);
     39         
     40         // Draw blanks before first of month
     41         tableRow = django.util.quickElement('tr', tableBody);
     42         for (var i = 0; i < startingPos; i++) {
     43            var _cell = django.util.quickElement('td', tableRow, ' ');
     44            _cell.style.backgroundColor = '#f3f3f3';
     45         }
     46         
     47         // Draw days of month
     48         var currentDay = 1;
     49         for (var i = startingPos; currentDay <= days; i++) {
     50            if (i%7 == 0 && currentDay != 1) {
     51               tableRow = django.util.quickElement('tr', tableBody);
     52            }
     53            var cell = django.util.quickElement('td', tableRow, '');
     54            django.util.quickElement('a', cell, currentDay, 'href', 'javascript:void(' + callback + '('+year+','+month+','+currentDay+'));');
     55            currentDay++;
     56         }
     57         
     58         // Draw blanks after end of month (optional, but makes for valid code)
     59         while (tableRow.childNodes.length < 7) {
     60            var _cell = django.util.quickElement('td', tableRow, ' ');
     61            _cell.style.backgroundColor = '#f3f3f3';
     62         }
     63         
     64         calDiv.appendChild(calTable);
     65      }
     66   },
     67   
     68   // Calendar -- A calendar instance
     69   Calendar: function(div_id, callback) {
     70      // div_id (string) is the ID of the element in which the calendar will
     71      //     be displayed
     72      // callback (string) is the name of a JavaScript function that will be
     73      //     called with the parameters (year, month, day) when a day in the
     74      //     calendar is clicked
     75      this.div_id = div_id;
     76      this.callback = callback;
     77      this.today = new Date();
     78      this.currentMonth = this.today.getMonth() + 1;
     79      this.currentYear = this.today.getFullYear();
     80   }
     81   
     82};
     83
     84django.datetime.calendar.Calendar.prototype = {
     85   drawCurrent: function() {
     86      django.datetime.calendar.CalendarNamespace.draw(this.currentMonth, this.currentYear, this.div_id, this.callback);
     87   },
     88   drawDate: function(month, year) {
     89      this.currentMonth = month;
     90      this.currentYear = year;
     91      this.drawCurrent();
     92   },
     93   drawPreviousMonth: function() {
     94      if (this.currentMonth == 1) {
     95         this.currentMonth = 12;
     96         this.currentYear--;
     97      }
     98      else {
     99         this.currentMonth--;
     100      }
     101      this.drawCurrent();
     102   },
     103   drawNextMonth: function() {
     104      if (this.currentMonth == 12) {
     105         this.currentMonth = 1;
     106         this.currentYear++;
     107      }
     108      else {
     109         this.currentMonth++;
     110      }
     111      this.drawCurrent();
     112   },
     113   drawPreviousYear: function() {
     114      this.currentYear--;
     115      this.drawCurrent();
     116   },
     117   drawNextYear: function() {
     118      this.currentYear++;
     119      this.drawCurrent();
     120   }
     121}       
  • media/js/SelectBox.js

     
    1 var SelectBox = {
    2     cache: new Object(),
    3     init: function(id) {
    4         var box = document.getElementById(id);
    5         var node;
    6         SelectBox.cache[id] = new Array();
    7         var cache = SelectBox.cache[id];
    8         for (var i = 0; (node = box.options[i]); i++) {
    9             cache.push({ value: node.value, text: node.text, displayed: 1 });
    10         }
    11     },
    12     redisplay: function(id) {
    13         // Repopulate HTML select box from cache
    14         var box = document.getElementById(id);
    15         box.options.length = 0; // clear all options
    16         for (var i = 0, j = SelectBox.cache[id].length; i < j; i++) {
    17             var node = SelectBox.cache[id][i];
    18             if (node.displayed) {
    19                 box.options[box.options.length] = new Option(node.text, node.value, false, false);
    20             }
    21         }
    22     },
    23     filter: function(id, text) {
    24         // Redisplay the HTML select box, displaying only the choices containing ALL
    25         // the words in text. (It's an AND search.)
    26         var tokens = text.toLowerCase().split(/\s+/);
    27         var node, token;
    28         for (var i = 0; (node = SelectBox.cache[id][i]); i++) {
    29             node.displayed = 1;
    30             for (var j = 0; (token = tokens[j]); j++) {
    31                 if (node.text.toLowerCase().indexOf(token) == -1) {
    32                     node.displayed = 0;
    33                 }
    34             }
    35         }
    36         SelectBox.redisplay(id);
    37     },
    38     delete_from_cache: function(id, value) {
    39         var node, delete_index = null;
    40         for (var i = 0; (node = SelectBox.cache[id][i]); i++) {
    41             if (node.value == value) {
    42                 delete_index = i;
    43                 break;
    44             }
    45         }
    46         var j = SelectBox.cache[id].length - 1;
    47         for (var i = delete_index; i < j; i++) {
    48             SelectBox.cache[id][i] = SelectBox.cache[id][i+1];
    49         }
    50         SelectBox.cache[id].length--;
    51     },
    52     add_to_cache: function(id, option) {
    53         SelectBox.cache[id].push({ value: option.value, text: option.text, displayed: 1 });
    54     },
    55     cache_contains: function(id, value) {
    56         // Check if an item is contained in the cache
    57         var node;
    58         for (var i = 0; (node = SelectBox.cache[id][i]); i++) {
    59             if (node.value == value) {
    60                 return true;
    61             }
    62         }
    63         return false;
    64     },
    65     move: function(from, to) {
    66         var from_box = document.getElementById(from);
    67         var to_box = document.getElementById(to);
    68         var option;
    69         for (var i = 0; (option = from_box.options[i]); i++) {
    70             if (option.selected && SelectBox.cache_contains(from, option.value)) {
    71                 SelectBox.add_to_cache(to, { value: option.value, text: option.text, displayed: 1 });
    72                 SelectBox.delete_from_cache(from, option.value);
    73             }
    74         }
    75         SelectBox.redisplay(from);
    76         SelectBox.redisplay(to);
    77     },
    78     move_all: function(from, to) {
    79         var from_box = document.getElementById(from);
    80         var to_box = document.getElementById(to);
    81         var option;
    82         for (var i = 0; (option = from_box.options[i]); i++) {
    83             SelectBox.add_to_cache(to, { value: option.value, text: option.text, displayed: 1 });
    84             SelectBox.delete_from_cache(from, option.value);
    85         }
    86         SelectBox.redisplay(from);
    87         SelectBox.redisplay(to);
    88     },
    89     sort: function(id) {
    90         SelectBox.cache[id].sort( function(a, b) {
    91             a = a.text.toLowerCase();
    92             b = b.text.toLowerCase();
    93             try {
    94                 if (a > b) return 1;
    95                 if (a < b) return -1;
    96             }
    97             catch (e) {
    98                 // silently fail on IE 'unknown' exception
    99             }
    100             return 0;
    101         } );
    102     },
    103     select_all: function(id) {
    104         var box = document.getElementById(id);
    105         for (var i = 0; i < box.options.length; i++) {
    106             box.options[i].selected = 'selected';
    107         }
    108     }
    109 }
  • media/js/core.js

     
    1 // Core javascript helper functions
    2 
    3 // Cross-browser event handlers.
    4 function addEvent(obj, evType, fn) {
    5     if (obj.addEventListener) {
    6         obj.addEventListener(evType, fn, false);
    7         return true;
    8     } else if (obj.attachEvent) {
    9         var r = obj.attachEvent("on" + evType, fn);
    10         return r;
    11     } else {
    12         return false;
    13     }
    14 }
    15 
    16 function removeEvent(obj, evType, fn) {
    17     if (obj.removeEventListener) {
    18         obj.removeEventListener(evType, fn, false);
    19         return true;
    20     } else if (obj.detachEvent) {
    21         obj.detachEvent("on" + evType, fn);
    22     } else {
    23         return false;
    24     }
    25 }
    26 
    27 // quickElement(tagType, parentReference, textInChildNode, [, attribute, attributeValue ...]);
    28 function quickElement() {
    29     var obj = document.createElement(arguments[0]);
    30     if (arguments[2] != '' && arguments[2] != null) {
    31         var textNode = document.createTextNode(arguments[2]);
    32         obj.appendChild(textNode);
    33     }
    34     var len = arguments.length;
    35     for (var i = 3; i < len; i += 2) {
    36         obj.setAttribute(arguments[i], arguments[i+1]);
    37     }
    38     arguments[1].appendChild(obj);
    39     return obj;
    40 }
    41 
    42 // ----------------------------------------------------------------------------
    43 // Cross-browser xmlhttp object
    44 // from http://jibbering.com/2002/4/httprequest.html
    45 // ----------------------------------------------------------------------------
    46 var xmlhttp;
    47 /*@cc_on @*/
    48 /*@if (@_jscript_version >= 5)
    49     try {
    50         xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
    51     } catch (e) {
    52         try {
    53             xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
    54         } catch (E) {
    55             xmlhttp = false;
    56         }
    57     }
    58 @else
    59     xmlhttp = false;
    60 @end @*/
    61 if (!xmlhttp && typeof XMLHttpRequest != 'undefined') {
    62   xmlhttp = new XMLHttpRequest();
    63 }
    64 
    65 // ----------------------------------------------------------------------------
    66 // Find-position functions by PPK
    67 // See http://www.quirksmode.org/js/findpos.html
    68 // ----------------------------------------------------------------------------
    69 function findPosX(obj) {
    70     var curleft = 0;
    71     if (obj.offsetParent) {
    72         while (obj.offsetParent) {
    73             curleft += obj.offsetLeft;
    74             obj = obj.offsetParent;
    75         }
    76     } else if (obj.x) {
    77         curleft += obj.x;
    78     }
    79     return curleft;
    80 }
    81 
    82 function findPosY(obj) {
    83     var curtop = 0;
    84     if (obj.offsetParent) {
    85         while (obj.offsetParent) {
    86             curtop += obj.offsetTop;
    87             obj = obj.offsetParent;
    88         }
    89     } else if (obj.y) {
    90         curtop += obj.y;
    91     }
    92     return curtop;
    93 }
    94 
    95 //-----------------------------------------------------------------------------
    96 // Date object extensions
    97 // ----------------------------------------------------------------------------
    98 Date.prototype.getCorrectYear = function() {
    99     // Date.getYear() is unreliable --
    100     // see http://www.quirksmode.org/js/introdate.html#year
    101     var y = this.getYear() % 100;
    102     return (y < 38) ? y + 2000 : y + 1900;
    103 }
    104 
    105 Date.prototype.getTwoDigitMonth = function() {
    106     return (this.getMonth() < 9) ? '0' + (this.getMonth()+1) : (this.getMonth()+1);
    107 }
    108 
    109 Date.prototype.getTwoDigitDate = function() {
    110     return (this.getDate() < 10) ? '0' + this.getDate() : this.getDate();
    111 }
    112 
    113 Date.prototype.getTwoDigitHour = function() {
    114     return (this.getHours() < 10) ? '0' + this.getHours() : this.getHours();
    115 }
    116 
    117 Date.prototype.getTwoDigitMinute = function() {
    118     return (this.getMinutes() < 10) ? '0' + this.getMinutes() : this.getMinutes();
    119 }
    120 
    121 Date.prototype.getISODate = function() {
    122     return this.getCorrectYear() + '-' + this.getTwoDigitMonth() + '-' + this.getTwoDigitDate();
    123 }
    124 
    125 Date.prototype.getHourMinute = function() {
    126     return this.getTwoDigitHour() + ':' + this.getTwoDigitMinute();
    127 }
    128 
    129 // ----------------------------------------------------------------------------
    130 // String object extensions
    131 // ----------------------------------------------------------------------------
    132 String.prototype.pad_left = function(pad_length, pad_string) {
    133     var new_string = this;
    134     for (var i = 0; new_string.length < pad_length; i++) {
    135         new_string = pad_string + new_string;
    136     }
    137     return new_string;
    138 }
    139  No newline at end of file
  • media/js/dateparse.js

     
    1 /* 'Magic' date parsing, by Simon Willison (6th October 2003)
    2    http://simon.incutio.com/archive/2003/10/06/betterDateInput
    3    Adapted for 6newslawrence.com, 28th January 2004
    4 */
    5 
    6 /* Finds the index of the first occurence of item in the array, or -1 if not found */
    7 if (typeof Array.prototype.indexOf == 'undefined') {
    8     Array.prototype.indexOf = function(item) {
    9         var len = this.length;
    10         for (var i = 0; i < len; i++) {
    11             if (this[i] == item) {
    12                 return i;
    13             }
    14         }
    15         return -1;
    16     };
    17 }
    18 /* Returns an array of items judged 'true' by the passed in test function */
    19 if (typeof Array.prototype.filter == 'undefined') {
    20     Array.prototype.filter = function(test) {
    21         var matches = [];
    22         var len = this.length;
    23         for (var i = 0; i < len; i++) {
    24             if (test(this[i])) {
    25                 matches[matches.length] = this[i];
    26             }
    27         }
    28         return matches;
    29     };
    30 }
    31 
    32 var monthNames = gettext("January February March April May June July August September October November December").split(" ");
    33 var weekdayNames = gettext("Sunday Monday Tuesday Wednesday Thursday Friday Saturday").split(" ");
    34 
    35 /* Takes a string, returns the index of the month matching that string, throws
    36    an error if 0 or more than 1 matches
    37 */
    38 function parseMonth(month) {
    39     var matches = monthNames.filter(function(item) {
    40         return new RegExp("^" + month, "i").test(item);
    41     });
    42     if (matches.length == 0) {
    43         throw new Error("Invalid month string");
    44     }
    45     if (matches.length > 1) {
    46         throw new Error("Ambiguous month");
    47     }
    48     return monthNames.indexOf(matches[0]);
    49 }
    50 /* Same as parseMonth but for days of the week */
    51 function parseWeekday(weekday) {
    52     var matches = weekdayNames.filter(function(item) {
    53         return new RegExp("^" + weekday, "i").test(item);
    54     });
    55     if (matches.length == 0) {
    56         throw new Error("Invalid day string");
    57     }
    58     if (matches.length > 1) {
    59         throw new Error("Ambiguous weekday");
    60     }
    61     return weekdayNames.indexOf(matches[0]);
    62 }
    63 
    64 /* Array of objects, each has 're', a regular expression and 'handler', a
    65    function for creating a date from something that matches the regular
    66    expression. Handlers may throw errors if string is unparseable.
    67 */
    68 var dateParsePatterns = [
    69     // Today
    70     {   re: /^tod/i,
    71         handler: function() {
    72             return new Date();
    73         }
    74     },
    75     // Tomorrow
    76     {   re: /^tom/i,
    77         handler: function() {
    78             var d = new Date();
    79             d.setDate(d.getDate() + 1);
    80             return d;
    81         }
    82     },
    83     // Yesterday
    84     {   re: /^yes/i,
    85         handler: function() {
    86             var d = new Date();
    87             d.setDate(d.getDate() - 1);
    88             return d;
    89         }
    90     },
    91     // 4th
    92     {   re: /^(\d{1,2})(st|nd|rd|th)?$/i,
    93         handler: function(bits) {
    94             var d = new Date();
    95             d.setDate(parseInt(bits[1], 10));
    96             return d;
    97         }
    98     },
    99     // 4th Jan
    100     {   re: /^(\d{1,2})(?:st|nd|rd|th)? (\w+)$/i,
    101         handler: function(bits) {
    102             var d = new Date();
    103             d.setDate(parseInt(bits[1], 10));
    104             d.setMonth(parseMonth(bits[2]));
    105             return d;
    106         }
    107     },
    108     // 4th Jan 2003
    109     {   re: /^(\d{1,2})(?:st|nd|rd|th)? (\w+),? (\d{4})$/i,
    110         handler: function(bits) {
    111             var d = new Date();
    112             d.setDate(parseInt(bits[1], 10));
    113             d.setMonth(parseMonth(bits[2]));
    114             d.setYear(bits[3]);
    115             return d;
    116         }
    117     },
    118     // Jan 4th
    119     {   re: /^(\w+) (\d{1,2})(?:st|nd|rd|th)?$/i,
    120         handler: function(bits) {
    121             var d = new Date();
    122             d.setDate(parseInt(bits[2], 10));
    123             d.setMonth(parseMonth(bits[1]));
    124             return d;
    125         }
    126     },
    127     // Jan 4th 2003
    128     {   re: /^(\w+) (\d{1,2})(?:st|nd|rd|th)?,? (\d{4})$/i,
    129         handler: function(bits) {
    130             var d = new Date();
    131             d.setDate(parseInt(bits[2], 10));
    132             d.setMonth(parseMonth(bits[1]));
    133             d.setYear(bits[3]);
    134             return d;
    135         }
    136     },
    137     // next Tuesday - this is suspect due to weird meaning of "next"
    138     {   re: /^next (\w+)$/i,
    139         handler: function(bits) {
    140             var d = new Date();
    141             var day = d.getDay();
    142             var newDay = parseWeekday(bits[1]);
    143             var addDays = newDay - day;
    144             if (newDay <= day) {
    145                 addDays += 7;
    146             }
    147             d.setDate(d.getDate() + addDays);
    148             return d;
    149         }
    150     },
    151     // last Tuesday
    152     {   re: /^last (\w+)$/i,
    153         handler: function(bits) {
    154             throw new Error("Not yet implemented");
    155         }
    156     },
    157     // mm/dd/yyyy (American style)
    158     {   re: /(\d{1,2})\/(\d{1,2})\/(\d{4})/,
    159         handler: function(bits) {
    160             var d = new Date();
    161             d.setYear(bits[3]);
    162             d.setDate(parseInt(bits[2], 10));
    163             d.setMonth(parseInt(bits[1], 10) - 1); // Because months indexed from 0
    164             return d;
    165         }
    166     },
    167     // yyyy-mm-dd (ISO style)
    168     {   re: /(\d{4})-(\d{1,2})-(\d{1,2})/,
    169         handler: function(bits) {
    170             var d = new Date();
    171             d.setYear(parseInt(bits[1]));
    172             d.setDate(parseInt(bits[3], 10));
    173             d.setMonth(parseInt(bits[2], 10) - 1);
    174             return d;
    175         }
    176     },
    177 ];
    178 
    179 function parseDateString(s) {
    180     for (var i = 0; i < dateParsePatterns.length; i++) {
    181         var re = dateParsePatterns[i].re;
    182         var handler = dateParsePatterns[i].handler;
    183         var bits = re.exec(s);
    184         if (bits) {
    185             return handler(bits);
    186         }
    187     }
    188     throw new Error("Invalid date string");
    189 }
    190 
    191 function fmt00(x) {
    192     // fmt00: Tags leading zero onto numbers 0 - 9.
    193     // Particularly useful for displaying results from Date methods.
    194     //
    195     if (Math.abs(parseInt(x)) < 10){
    196         x = "0"+ Math.abs(x);
    197     }
    198     return x;
    199 }
    200 
    201 function parseDateStringISO(s) {
    202     try {
    203         var d = parseDateString(s);
    204         return d.getFullYear() + '-' + (fmt00(d.getMonth() + 1)) + '-' + fmt00(d.getDate())
    205     }
    206     catch (e) { return s; }
    207 }
    208 function magicDate(input) {
    209     var messagespan = input.id + 'Msg';
    210     try {
    211         var d = parseDateString(input.value);
    212         input.value = d.getFullYear() + '-' + (fmt00(d.getMonth() + 1)) + '-' +
    213             fmt00(d.getDate());
    214         input.className = '';
    215         // Human readable date
    216         if (document.getElementById(messagespan)) {
    217             document.getElementById(messagespan).firstChild.nodeValue = d.toDateString();
    218             document.getElementById(messagespan).className = 'normal';
    219         }
    220     }
    221     catch (e) {
    222         input.className = 'error';
    223         var message = e.message;
    224         // Fix for IE6 bug
    225         if (message.indexOf('is null or not an object') > -1) {
    226             message = 'Invalid date string';
    227         }
    228         if (document.getElementById(messagespan)) {
    229             document.getElementById(messagespan).firstChild.nodeValue = message;
    230             document.getElementById(messagespan).className = 'error';
    231         }
    232     }
    233 }
  • media/js/getElementsBySelector.js

     
    1 /* document.getElementsBySelector(selector)
    2    - returns an array of element objects from the current document
    3      matching the CSS selector. Selectors can contain element names,
    4      class names and ids and can be nested. For example:
    5      
    6        elements = document.getElementsBySelect('div#main p a.external')
    7      
    8      Will return an array of all 'a' elements with 'external' in their
    9      class attribute that are contained inside 'p' elements that are
    10      contained inside the 'div' element which has id="main"
    11 
    12    New in version 0.4: Support for CSS2 and CSS3 attribute selectors:
    13    See http://www.w3.org/TR/css3-selectors/#attribute-selectors
    14 
    15    Version 0.4 - Simon Willison, March 25th 2003
    16    -- Works in Phoenix 0.5, Mozilla 1.3, Opera 7, Internet Explorer 6, Internet Explorer 5 on Windows
    17    -- Opera 7 fails
    18 */
    19 
    20 function getAllChildren(e) {
    21   // Returns all children of element. Workaround required for IE5/Windows. Ugh.
    22   return e.all ? e.all : e.getElementsByTagName('*');
    23 }
    24 
    25 document.getElementsBySelector = function(selector) {
    26   // Attempt to fail gracefully in lesser browsers
    27   if (!document.getElementsByTagName) {
    28     return new Array();
    29   }
    30   // Split selector in to tokens
    31   var tokens = selector.split(' ');
    32   var currentContext = new Array(document);
    33   for (var i = 0; i < tokens.length; i++) {
    34     token = tokens[i].replace(/^\s+/,'').replace(/\s+$/,'');;
    35     if (token.indexOf('#') > -1) {
    36       // Token is an ID selector
    37       var bits = token.split('#');
    38       var tagName = bits[0];
    39       var id = bits[1];
    40       var element = document.getElementById(id);
    41       if (tagName && element.nodeName.toLowerCase() != tagName) {
    42         // tag with that ID not found, return false
    43         return new Array();
    44       }
    45       // Set currentContext to contain just this element
    46       currentContext = new Array(element);
    47       continue; // Skip to next token
    48     }
    49     if (token.indexOf('.') > -1) {
    50       // Token contains a class selector
    51       var bits = token.split('.');
    52       var tagName = bits[0];
    53       var className = bits[1];
    54       if (!tagName) {
    55         tagName = '*';
    56       }
    57       // Get elements matching tag, filter them for class selector
    58       var found = new Array;
    59       var foundCount = 0;
    60       for (var h = 0; h < currentContext.length; h++) {
    61         var elements;
    62         if (tagName == '*') {
    63             elements = getAllChildren(currentContext[h]);
    64         } else {
    65             try {
    66                 elements = currentContext[h].getElementsByTagName(tagName);
    67             }
    68             catch(e) {
    69                 elements = [];
    70             }
    71         }
    72         for (var j = 0; j < elements.length; j++) {
    73           found[foundCount++] = elements[j];
    74         }
    75       }
    76       currentContext = new Array;
    77       var currentContextIndex = 0;
    78       for (var k = 0; k < found.length; k++) {
    79         if (found[k].className && found[k].className.match(new RegExp('\\b'+className+'\\b'))) {
    80           currentContext[currentContextIndex++] = found[k];
    81         }
    82       }
    83       continue; // Skip to next token
    84     }
    85     // Code to deal with attribute selectors
    86     if (token.match(/^(\w*)\[(\w+)([=~\|\^\$\*]?)=?"?([^\]"]*)"?\]$/)) {
    87       var tagName = RegExp.$1;
    88       var attrName = RegExp.$2;
    89       var attrOperator = RegExp.$3;
    90       var attrValue = RegExp.$4;
    91       if (!tagName) {
    92         tagName = '*';
    93       }
    94       // Grab all of the tagName elements within current context
    95       var found = new Array;
    96       var foundCount = 0;
    97       for (var h = 0; h < currentContext.length; h++) {
    98         var elements;
    99         if (tagName == '*') {
    100             elements = getAllChildren(currentContext[h]);
    101         } else {
    102             elements = currentContext[h].getElementsByTagName(tagName);
    103         }
    104         for (var j = 0; j < elements.length; j++) {
    105           found[foundCount++] = elements[j];
    106         }
    107       }
    108       currentContext = new Array;
    109       var currentContextIndex = 0;
    110       var checkFunction; // This function will be used to filter the elements
    111       switch (attrOperator) {
    112         case '=': // Equality
    113           checkFunction = function(e) { return (e.getAttribute(attrName) == attrValue); };
    114           break;
    115         case '~': // Match one of space seperated words
    116           checkFunction = function(e) { return (e.getAttribute(attrName).match(new RegExp('\\b'+attrValue+'\\b'))); };
    117           break;
    118         case '|': // Match start with value followed by optional hyphen
    119           checkFunction = function(e) { return (e.getAttribute(attrName).match(new RegExp('^'+attrValue+'-?'))); };
    120           break;
    121         case '^': // Match starts with value
    122           checkFunction = function(e) { return (e.getAttribute(attrName).indexOf(attrValue) == 0); };
    123           break;
    124         case '$': // Match ends with value - fails with "Warning" in Opera 7
    125           checkFunction = function(e) { return (e.getAttribute(attrName).lastIndexOf(attrValue) == e.getAttribute(attrName).length - attrValue.length); };
    126           break;
    127         case '*': // Match ends with value
    128           checkFunction = function(e) { return (e.getAttribute(attrName).indexOf(attrValue) > -1); };
    129           break;
    130         default :
    131           // Just test for existence of attribute
    132           checkFunction = function(e) { return e.getAttribute(attrName); };
    133       }
    134       currentContext = new Array;
    135       var currentContextIndex = 0;
    136       for (var k = 0; k < found.length; k++) {
    137         if (checkFunction(found[k])) {
    138           currentContext[currentContextIndex++] = found[k];
    139         }
    140       }
    141       // alert('Attribute Selector: '+tagName+' '+attrName+' '+attrOperator+' '+attrValue);
    142       continue; // Skip to next token
    143     }
    144     // If we get here, token is JUST an element (not a class or ID selector)
    145     tagName = token;
    146     var found = new Array;
    147     var foundCount = 0;
    148     for (var h = 0; h < currentContext.length; h++) {
    149       var elements = currentContext[h].getElementsByTagName(tagName);
    150       for (var j = 0; j < elements.length; j++) {
    151         found[foundCount++] = elements[j];
    152       }
    153     }
    154     currentContext = found;
    155   }
    156   return currentContext;
    157 }
    158 
    159 /* That revolting regular expression explained
    160 /^(\w+)\[(\w+)([=~\|\^\$\*]?)=?"?([^\]"]*)"?\]$/
    161   \---/  \---/\-------------/    \-------/
    162     |      |         |               |
    163     |      |         |           The value
    164     |      |    ~,|,^,$,* or =
    165     |   Attribute
    166    Tag
    167 */
  • media/js/calendar.js

     
    1 /*
    2 calendar.js - Calendar functions by Adrian Holovaty
    3 */
    4 
    5 function removeChildren(a) { // "a" is reference to an object
    6     while (a.hasChildNodes()) a.removeChild(a.lastChild);
    7 }
    8 
    9 // quickElement(tagType, parentReference, textInChildNode, [, attribute, attributeValue ...]);
    10 function quickElement() {
    11     var obj = document.createElement(arguments[0]);
    12     if (arguments[2] != '' && arguments[2] != null) {
    13         var textNode = document.createTextNode(arguments[2]);
    14         obj.appendChild(textNode);
    15     }
    16     var len = arguments.length;
    17     for (var i = 3; i < len; i += 2) {
    18         obj.setAttribute(arguments[i], arguments[i+1]);
    19     }
    20     arguments[1].appendChild(obj);
    21     return obj;
    22 }
    23 
    24 // CalendarNamespace -- Provides a collection of HTML calendar-related helper functions
    25 var CalendarNamespace = {
    26     monthsOfYear: gettext('January February March April May June July August September October November December').split(' '),
    27     daysOfWeek: gettext('S M T W T F S').split(' '),
    28     isLeapYear: function(year) {
    29         return (((year % 4)==0) && ((year % 100)!=0) || ((year % 400)==0));
    30     },
    31     getDaysInMonth: function(month,year) {
    32         var days;
    33         if (month==1 || month==3 || month==5 || month==7 || month==8 || month==10 || month==12) {
    34             days = 31;
    35         }
    36         else if (month==4 || month==6 || month==9 || month==11) {
    37             days = 30;
    38         }
    39         else if (month==2 && CalendarNamespace.isLeapYear(year)) {
    40             days = 29;
    41         }
    42         else {
    43             days = 28;
    44         }
    45         return days;
    46     },
    47     draw: function(month, year, div_id, callback) { // month = 1-12, year = 1-9999
    48         month = parseInt(month);
    49         year = parseInt(year);
    50         var calDiv = document.getElementById(div_id);
    51         removeChildren(calDiv);
    52         var calTable = document.createElement('table');
    53         quickElement('caption', calTable, CalendarNamespace.monthsOfYear[month-1] + ' ' + year);
    54         var tableBody = quickElement('tbody', calTable);
    55 
    56         // Draw days-of-week header
    57         var tableRow = quickElement('tr', tableBody);
    58         for (var i = 0; i < 7; i++) {
    59             quickElement('th', tableRow, CalendarNamespace.daysOfWeek[i]);
    60         }
    61 
    62         var startingPos = new Date(year, month-1, 1).getDay();
    63         var days = CalendarNamespace.getDaysInMonth(month, year);
    64 
    65         // Draw blanks before first of month
    66         tableRow = quickElement('tr', tableBody);
    67         for (var i = 0; i < startingPos; i++) {
    68             var _cell = quickElement('td', tableRow, ' ');
    69             _cell.style.backgroundColor = '#f3f3f3';
    70         }
    71 
    72         // Draw days of month
    73         var currentDay = 1;
    74         for (var i = startingPos; currentDay <= days; i++) {
    75             if (i%7 == 0 && currentDay != 1) {
    76                 tableRow = quickElement('tr', tableBody);
    77             }
    78             var cell = quickElement('td', tableRow, '');
    79             quickElement('a', cell, currentDay, 'href', 'javascript:void(' + callback + '('+year+','+month+','+currentDay+'));');
    80             currentDay++;
    81         }
    82 
    83         // Draw blanks after end of month (optional, but makes for valid code)
    84         while (tableRow.childNodes.length < 7) {
    85             var _cell = quickElement('td', tableRow, ' ');
    86             _cell.style.backgroundColor = '#f3f3f3';
    87         }
    88 
    89         calDiv.appendChild(calTable);
    90     }
    91 }
    92 
    93 // Calendar -- A calendar instance
    94 function Calendar(div_id, callback) {
    95     // div_id (string) is the ID of the element in which the calendar will
    96     //     be displayed
    97     // callback (string) is the name of a JavaScript function that will be
    98     //     called with the parameters (year, month, day) when a day in the
    99     //     calendar is clicked
    100     this.div_id = div_id;
    101     this.callback = callback;
    102     this.today = new Date();
    103     this.currentMonth = this.today.getMonth() + 1;
    104     this.currentYear = this.today.getFullYear();
    105 }
    106 Calendar.prototype = {
    107     drawCurrent: function() {
    108         CalendarNamespace.draw(this.currentMonth, this.currentYear, this.div_id, this.callback);
    109     },
    110     drawDate: function(month, year) {
    111         this.currentMonth = month;
    112         this.currentYear = year;
    113         this.drawCurrent();
    114     },
    115     drawPreviousMonth: function() {
    116         if (this.currentMonth == 1) {
    117             this.currentMonth = 12;
    118             this.currentYear--;
    119         }
    120         else {
    121             this.currentMonth--;
    122         }
    123         this.drawCurrent();
    124     },
    125     drawNextMonth: function() {
    126         if (this.currentMonth == 12) {
    127             this.currentMonth = 1;
    128             this.currentYear++;
    129         }
    130         else {
    131             this.currentMonth++;
    132         }
    133         this.drawCurrent();
    134     },
    135     drawPreviousYear: function() {
    136         this.currentYear--;
    137         this.drawCurrent();
    138     },
    139     drawNextYear: function() {
    140         this.currentYear++;
    141         this.drawCurrent();
    142     }
    143 }
  • media/js/timeparse.js

     
    1 var timeParsePatterns = [
    2     // 9
    3     {   re: /^\d{1,2}$/i,
    4         handler: function(bits) {
    5             if (bits[0].length == 1) {
    6                 return '0' + bits[0] + ':00';
    7             } else {
    8                 return bits[0] + ':00';
    9             }
    10         }
    11     },
    12     // 13:00
    13     {   re: /^\d{2}[:.]\d{2}$/i,
    14         handler: function(bits) {
    15             return bits[0].replace('.', ':');
    16         }
    17     },
    18     // 9:00
    19     {   re: /^\d[:.]\d{2}$/i,
    20         handler: function(bits) {
    21             return '0' + bits[0].replace('.', ':');
    22         }
    23     },
    24     // 3 am / 3 a.m. / 3am
    25     {   re: /^(\d+)\s*([ap])(?:.?m.?)?$/i,
    26         handler: function(bits) {
    27             var hour = parseInt(bits[1]);
    28             if (hour == 12) {
    29                 hour = 0;
    30             }
    31             if (bits[2].toLowerCase() == 'p') {
    32                 if (hour == 12) {
    33                     hour = 0;
    34                 }
    35                 return (hour + 12) + ':00';
    36             } else {
    37                 if (hour < 10) {
    38                     return '0' + hour + ':00';
    39                 } else {
    40                     return hour + ':00';
    41                 }
    42             }
    43         }
    44     },
    45     // 3.30 am / 3:15 a.m. / 3.00am
    46     {   re: /^(\d+)[.:](\d{2})\s*([ap]).?m.?$/i,
    47         handler: function(bits) {
    48             var hour = parseInt(bits[1]);
    49             var mins = parseInt(bits[2]);
    50             if (mins < 10) {
    51                 mins = '0' + mins;
    52             }
    53             if (hour == 12) {
    54                 hour = 0;
    55             }
    56             if (bits[3].toLowerCase() == 'p') {
    57                 if (hour == 12) {
    58                     hour = 0;
    59                 }
    60                 return (hour + 12) + ':' + mins;
    61             } else {
    62                 if (hour < 10) {
    63                     return '0' + hour + ':' + mins;
    64                 } else {
    65                     return hour + ':' + mins;
    66                 }
    67             }
    68         }
    69     },
    70     // noon
    71     {   re: /^no/i,
    72         handler: function(bits) {
    73             return '12:00';
    74         }
    75     },
    76     // midnight
    77     {   re: /^mid/i,
    78         handler: function(bits) {
    79             return '00:00';
    80         }
    81     }
    82 ];
    83 
    84 function parseTimeString(s) {
    85     for (var i = 0; i < timeParsePatterns.length; i++) {
    86         var re = timeParsePatterns[i].re;
    87         var handler = timeParsePatterns[i].handler;
    88         var bits = re.exec(s);
    89         if (bits) {
    90             return handler(bits);
    91         }
    92     }
    93     return s;
    94 }
  • media/js/urlify.js

     
    1 function URLify(s, num_chars) {
    2     // changes, e.g., "Petty theft" to "petty_theft"
    3     // remove all these words from the string before urlifying
    4     removelist = ["a", "an", "as", "at", "before", "but", "by", "for", "from",
    5                   "is", "in", "into", "like", "of", "off", "on", "onto", "per",
    6                   "since", "than", "the", "this", "that", "to", "up", "via",
    7                   "with"];
    8     r = new RegExp('\\b(' + removelist.join('|') + ')\\b', 'gi');
    9     s = s.replace(r, '');
    10     s = s.replace(/[^-A-Z0-9\s]/gi, '');  // remove unneeded chars
    11     s = s.replace(/^\s+|\s+$/g, ''); // trim leading/trailing spaces
    12     s = s.replace(/\s+/g, '-');      // convert spaces to hyphens
    13     s = s.toLowerCase();             // convert to lowercase
    14     return s.substring(0, num_chars);// trim to first num_chars chars
    15 }
    16  No newline at end of file
  • media/js/admin/RelatedObjectLookups.js

     
    1 // Handles related-objects functionality: lookup link for raw_id_admin=True
    2 // and Add Another links.
    3 
    4 function showRelatedObjectLookupPopup(triggeringLink) {
    5     var name = triggeringLink.id.replace(/^lookup_/, '');
    6     var href;
    7     if (triggeringLink.href.search(/\?/) >= 0) {
    8         href = triggeringLink.href + '&pop=1';
    9     } else {
    10         href = triggeringLink.href + '?pop=1';
    11     }
    12     var win = window.open(href, name, 'height=500,width=740,resizable=yes,scrollbars=yes');
    13     win.focus();
    14     return false;
    15 }
    16 
    17 function dismissRelatedLookupPopup(win, chosenId) {
    18     var elem = document.getElementById(win.name);
    19     if (elem.className.indexOf('vRawIdAdminField') != -1 && elem.value) {
    20         elem.value += ',' + chosenId;
    21     } else {
    22         document.getElementById(win.name).value = chosenId;
    23     }
    24     win.close();
    25 }
    26 
    27 function showAddAnotherPopup(triggeringLink) {
    28     var name = triggeringLink.id.replace(/^add_/, '');
    29     name = name.replace(/\./g, '___');
    30     var win = window.open(triggeringLink.href + '?_popup=1', name, 'height=500,width=800,resizable=yes,scrollbars=yes');
    31     win.focus();
    32     return false;
    33 }
    34 
    35 function dismissAddAnotherPopup(win, newId, newRepr) {
    36     var name = win.name.replace(/___/g, '.');
    37     var elem = document.getElementById(name);
    38     if (elem) {
    39         if (elem.nodeName == 'SELECT') {
    40             var o = new Option(newRepr, newId);
    41             elem.options[elem.options.length] = o;
    42             elem.selectedIndex = elem.length - 1;
    43         } else if (elem.nodeName == 'INPUT') {
    44             elem.value = newId;
    45         }
    46     } else {
    47         var toId = name + "_to";
    48         elem = document.getElementById(toId);
    49         var o = new Option(newRepr, newId);
    50         SelectBox.add_to_cache(toId, o);
    51         SelectBox.redisplay(toId);
    52     }
    53     win.close();
    54 }
  • media/js/admin/CollapsedFieldsets.js

     
    1 // Finds all fieldsets with class="collapse", collapses them, and gives each
    2 // one a "Show" link that uncollapses it. The "Show" link becomes a "Hide"
    3 // link when the fieldset is visible.
    4 
    5 function findForm(node) {
    6         // returns the node of the form containing the given node
    7         if (node.tagName.toLowerCase() != 'form') {
    8                 return findForm(node.parentNode);
    9         }
    10         return node;
    11 }
    12 
    13 var CollapsedFieldsets = {
    14         collapse_re: /\bcollapse\b/,   // Class of fieldsets that should be dealt with.
    15         collapsed_re: /\bcollapsed\b/, // Class that fieldsets get when they're hidden.
    16         collapsed_class: 'collapsed',
    17         init: function() {
    18                 var fieldsets = document.getElementsByTagName('fieldset');
    19                 var collapsed_seen = false;
    20                 for (var i = 0, fs; fs = fieldsets[i]; i++) {
    21                         // Collapse this fieldset if it has the correct class, and if it
    22                         // doesn't have any errors. (Collapsing shouldn't apply in the case
    23                         // of error messages.)
    24                         if (fs.className.match(CollapsedFieldsets.collapse_re) && !CollapsedFieldsets.fieldset_has_errors(fs)) {
    25                                 collapsed_seen = true;
    26                                 // Give it an additional class, used by CSS to hide it.
    27                                 fs.className += ' ' + CollapsedFieldsets.collapsed_class;
    28                                 // (<a id="fieldsetcollapser3" class="collapse-toggle" href="#">Show</a>)
    29                                 var collapse_link = document.createElement('a');
    30                                 collapse_link.className = 'collapse-toggle';
    31                                 collapse_link.id = 'fieldsetcollapser' + i;
    32                                 collapse_link.onclick = new Function('CollapsedFieldsets.show('+i+'); return false;');
    33                                 collapse_link.href = '#';
    34                                 collapse_link.innerHTML = 'Show';
    35                                 var h2 = fs.getElementsByTagName('h2')[0];
    36                                 h2.appendChild(document.createTextNode(' ('));
    37                                 h2.appendChild(collapse_link);
    38                                 h2.appendChild(document.createTextNode(')'));
    39                         }
    40                 }
    41                 if (collapsed_seen) {
    42                         // Expand all collapsed fieldsets when form is submitted.
    43                         addEvent(findForm(document.getElementsByTagName('fieldset')[0]), 'submit', function() { CollapsedFieldsets.uncollapse_all(); });
    44                 }
    45         },
    46         fieldset_has_errors: function(fs) {
    47                 // Returns true if any fields in the fieldset have validation errors.
    48                 var divs = fs.getElementsByTagName('div');
    49                 for (var i=0; i<divs.length; i++) {
    50                         if (divs[i].className.match(/\berror\b/)) {
    51                                 return true;
    52                         }
    53                 }
    54                 return false;
    55         },
    56         show: function(fieldset_index) {
    57                 var fs = document.getElementsByTagName('fieldset')[fieldset_index];
    58                 // Remove the class name that causes the "display: none".
    59                 fs.className = fs.className.replace(CollapsedFieldsets.collapsed_re, '');
    60                 // Toggle the "Show" link to a "Hide" link
    61                 var collapse_link = document.getElementById('fieldsetcollapser' + fieldset_index);
    62                 collapse_link.onclick = new Function('CollapsedFieldsets.hide('+fieldset_index+'); return false;');
    63                 collapse_link.innerHTML = 'Hide';
    64         },
    65         hide: function(fieldset_index) {
    66                 var fs = document.getElementsByTagName('fieldset')[fieldset_index];
    67                 // Add the class name that causes the "display: none".
    68                 fs.className += ' ' + CollapsedFieldsets.collapsed_class;
    69                 // Toggle the "Hide" link to a "Show" link
    70                 var collapse_link = document.getElementById('fieldsetcollapser' + fieldset_index);
    71         collapse_link.onclick = new Function('CollapsedFieldsets.show('+fieldset_index+'); return false;');
    72                 collapse_link.innerHTML = 'Show';
    73         },
    74        
    75         uncollapse_all: function() {
    76                 var fieldsets = document.getElementsByTagName('fieldset');
    77                 for (var i=0; i<fieldsets.length; i++) {
    78                         if (fieldsets[i].className.match(CollapsedFieldsets.collapsed_re)) {
    79                                 CollapsedFieldsets.show(i);
    80                         }
    81                 }
    82         }
    83 }
    84 
    85 addEvent(window, 'load', CollapsedFieldsets.init);
  • media/js/admin/ordering.js

     
    1 addEvent(window, 'load', reorder_init);
    2 
    3 var lis;
    4 var top = 0;
    5 var left = 0;
    6 var height = 30;
    7 
    8 function reorder_init() {
    9     lis = document.getElementsBySelector('ul#orderthese li');
    10     var input = document.getElementsBySelector('input[name=order_]')[0];
    11     setOrder(input.value.split(','));
    12     input.disabled = true;
    13     draw();
    14     // Now initialise the dragging behaviour
    15     var limit = (lis.length - 1) * height;
    16     for (var i = 0; i < lis.length; i++) {
    17         var li = lis[i];
    18         var img = document.getElementById('handle'+li.id);
    19         li.style.zIndex = 1;
    20         Drag.init(img, li, left + 10, left + 10, top + 10, top + 10 + limit);
    21         li.onDragStart = startDrag;
    22         li.onDragEnd = endDrag;
    23         img.style.cursor = 'move';
    24     }
    25 }
    26 
    27 function submitOrderForm() {
    28     var inputOrder = document.getElementsBySelector('input[name=order_]')[0];
    29     inputOrder.value = getOrder();
    30     inputOrder.disabled=false;
    31 }
    32 
    33 function startDrag() {
    34     this.style.zIndex = '10';
    35     this.className = 'dragging';
    36 }
    37 
    38 function endDrag(x, y) {
    39     this.style.zIndex = '1';
    40     this.className = '';
    41     // Work out how far along it has been dropped, using x co-ordinate
    42     var oldIndex = this.index;
    43     var newIndex = Math.round((y - 10 - top) / height);
    44     // 'Snap' to the correct position
    45     this.style.top = (10 + top + newIndex * height) + 'px';
    46     this.index = newIndex;
    47     moveItem(oldIndex, newIndex);
    48 }
    49 
    50 function moveItem(oldIndex, newIndex) {
    51     // Swaps two items, adjusts the index and left co-ord for all others
    52     if (oldIndex == newIndex) {
    53         return; // Nothing to swap;
    54     }
    55     var direction, lo, hi;
    56     if (newIndex > oldIndex) {
    57         lo = oldIndex;
    58         hi = newIndex;
    59         direction = -1;
    60     } else {
    61         direction = 1;
    62         hi = oldIndex;
    63         lo = newIndex;
    64     }
    65     var lis2 = new Array(); // We will build the new order in this array
    66     for (var i = 0; i < lis.length; i++) {
    67         if (i < lo || i > hi) {
    68             // Position of items not between the indexes is unaffected
    69             lis2[i] = lis[i];
    70             continue;
    71         } else if (i == newIndex) {
    72             lis2[i] = lis[oldIndex];
    73             continue;
    74         } else {
    75             // Item is between the two indexes - move it along 1
    76             lis2[i] = lis[i - direction];
    77         }
    78     }
    79     // Re-index everything
    80     reIndex(lis2);
    81     lis = lis2;
    82     draw();
    83 //    document.getElementById('hiddenOrder').value = getOrder();
    84     document.getElementsBySelector('input[name=order_]')[0].value = getOrder();
    85 }
    86 
    87 function reIndex(lis) {
    88     for (var i = 0; i < lis.length; i++) {
    89         lis[i].index = i;
    90     }
    91 }
    92 
    93 function draw() {
    94     for (var i = 0; i < lis.length; i++) {
    95         var li = lis[i];
    96         li.index = i;
    97         li.style.position = 'absolute';
    98         li.style.left = (10 + left) + 'px';
    99         li.style.top = (10 + top + (i * height)) + 'px';
    100     }
    101 }
    102 
    103 function getOrder() {
    104     var order = new Array(lis.length);
    105     for (var i = 0; i < lis.length; i++) {
    106         order[i] = lis[i].id.substring(1, 100);
    107     }
    108     return order.join(',');
    109 }
    110 
    111 function setOrder(id_list) {
    112     /* Set the current order to match the lsit of IDs */
    113     var temp_lis = new Array();
    114     for (var i = 0; i < id_list.length; i++) {
    115         var id = 'p' + id_list[i];
    116         temp_lis[temp_lis.length] = document.getElementById(id);
    117     }
    118     reIndex(temp_lis);
    119     lis = temp_lis;
    120     draw();
    121 }
    122 
    123 function addEvent(elm, evType, fn, useCapture)
    124 // addEvent and removeEvent
    125 // cross-browser event handling for IE5+,  NS6 and Mozilla
    126 // By Scott Andrew
    127 {
    128   if (elm.addEventListener){
    129     elm.addEventListener(evType, fn, useCapture);
    130     return true;
    131   } else if (elm.attachEvent){
    132     var r = elm.attachEvent("on"+evType, fn);
    133     return r;
    134   } else {
    135     elm['on'+evType] = fn;
    136   }
    137 }
  • media/js/admin/DateTimeShortcuts.js

     
    1 // Inserts shortcut buttons after all of the following:
    2 //     <input type="text" class="vDateField">
    3 //     <input type="text" class="vTimeField">
    4 
    5 var DateTimeShortcuts = {
    6     calendars: [],
    7     calendarInputs: [],
    8     clockInputs: [],
    9     calendarDivName1: 'calendarbox', // name of calendar <div> that gets toggled
    10     calendarDivName2: 'calendarin',  // name of <div> that contains calendar
    11     clockDivName: 'clockbox',        // name of clock <div> that gets toggled
    12     admin_media_prefix: '',
    13     init: function() {
    14         // Deduce admin_media_prefix by looking at the <script>s in the
    15         // current document and finding the URL of *this* module.
    16         var scripts = document.getElementsByTagName('script');
    17         for (var i=0; i<scripts.length; i++) {
    18             if (scripts[i].src.match(/DateTimeShortcuts/)) {
    19                 var idx = scripts[i].src.indexOf('js/admin/DateTimeShortcuts');
    20                 DateTimeShortcuts.admin_media_prefix = scripts[i].src.substring(0, idx);
    21                 break;
    22             }
    23         }
    24 
    25         var inputs = document.getElementsByTagName('input');
    26         for (i=0; i<inputs.length; i++) {
    27             var inp = inputs[i];
    28             if (inp.getAttribute('type') == 'text' && inp.className.match(/vTimeField/)) {
    29                 DateTimeShortcuts.addClock(inp);
    30             }
    31             else if (inp.getAttribute('type') == 'text' && inp.className.match(/vDateField/)) {
    32                 DateTimeShortcuts.addCalendar(inp);
    33             }
    34         }
    35     },
    36     // Add clock widget to a given field
    37     addClock: function(inp) {
    38         var num = DateTimeShortcuts.clockInputs.length;
    39         DateTimeShortcuts.clockInputs[num] = inp;
    40 
    41         // Shortcut links (clock icon and "Now" link)
    42         var shortcuts_span = document.createElement('span');
    43         inp.parentNode.insertBefore(shortcuts_span, inp.nextSibling);
    44         var now_link = document.createElement('a');
    45         now_link.setAttribute('href', "javascript:DateTimeShortcuts.handleClockQuicklink(" + num + ", new Date().getHourMinute());");
    46         now_link.appendChild(document.createTextNode(gettext('Now')));
    47         var clock_link = document.createElement('a');
    48         clock_link.setAttribute('href', 'javascript:DateTimeShortcuts.openClock(' + num + ');');
    49         quickElement('img', clock_link, '', 'src', DateTimeShortcuts.admin_media_prefix + 'img/admin/icon_clock.gif', 'alt', gettext('Clock'));
    50         shortcuts_span.appendChild(document.createTextNode('\240'));
    51         shortcuts_span.appendChild(now_link);
    52         shortcuts_span.appendChild(document.createTextNode('\240|\240'));
    53         shortcuts_span.appendChild(clock_link);
    54 
    55         // Create clock link div
    56         //
    57         // Markup looks like:
    58         // <div id="clockbox1" class="clockbox module">
    59         //     <h2>Choose a time</h2>
    60         //     <ul class="timelist">
    61         //         <li><a href="#">Now</a></li>
    62         //         <li><a href="#">Midnight</a></li>
    63         //         <li><a href="#">6 a.m.</a></li>
    64         //         <li><a href="#">Noon</a></li>
    65         //     </ul>
    66         //     <p class="calendar-cancel"><a href="#">Cancel</a></p>
    67         // </div>
    68 
    69         var clock_box = document.createElement('div');
    70         clock_box.style.display = 'none';
    71         clock_box.style.position = 'absolute';
    72         clock_box.style.left = findPosX(clock_link) + 17 + 'px';
    73         clock_box.style.top = findPosY(clock_link) - 30 + 'px';
    74         clock_box.className = 'clockbox module';
    75         clock_box.setAttribute('id', DateTimeShortcuts.clockDivName + num);
    76         document.body.appendChild(clock_box);
    77         addEvent(clock_box, 'click', DateTimeShortcuts.cancelEventPropagation);
    78 
    79         quickElement('h2', clock_box, gettext('Choose a time'));
    80         time_list = quickElement('ul', clock_box, '');
    81         time_list.className = 'timelist';
    82         quickElement("a", quickElement("li", time_list, ""), gettext("Now"), "href", "javascript:DateTimeShortcuts.handleClockQuicklink(" + num + ", new Date().getHourMinute());")
    83         quickElement("a", quickElement("li", time_list, ""), gettext("Midnight"), "href", "javascript:DateTimeShortcuts.handleClockQuicklink(" + num + ", '00:00');")
    84         quickElement("a", quickElement("li", time_list, ""), gettext("6 a.m."), "href", "javascript:DateTimeShortcuts.handleClockQuicklink(" + num + ", '06:00');")
    85         quickElement("a", quickElement("li", time_list, ""), gettext("Noon"), "href", "javascript:DateTimeShortcuts.handleClockQuicklink(" + num + ", '12:00');")
    86 
    87         cancel_p = quickElement('p', clock_box, '');
    88         cancel_p.className = 'calendar-cancel';
    89         quickElement('a', cancel_p, gettext('Cancel'), 'href', 'javascript:DateTimeShortcuts.dismissClock(' + num + ');');
    90     },
    91     openClock: function(num) {
    92         document.getElementById(DateTimeShortcuts.clockDivName + num).style.display = 'block';
    93         addEvent(window, 'click', function() { DateTimeShortcuts.dismissClock(num); return true; });
    94     },
    95     dismissClock: function(num) {
    96        document.getElementById(DateTimeShortcuts.clockDivName + num).style.display = 'none';
    97        window.onclick = null;
    98     },
    99     handleClockQuicklink: function(num, val) {
    100        DateTimeShortcuts.clockInputs[num].value = val;
    101        DateTimeShortcuts.dismissClock(num);
    102     },
    103     // Add calendar widget to a given field.
    104     addCalendar: function(inp) {
    105         var num = DateTimeShortcuts.calendars.length;
    106 
    107         DateTimeShortcuts.calendarInputs[num] = inp;
    108 
    109         // Shortcut links (calendar icon and "Today" link)
    110         var shortcuts_span = document.createElement('span');
    111         inp.parentNode.insertBefore(shortcuts_span, inp.nextSibling);
    112         var today_link = document.createElement('a');
    113         today_link.setAttribute('href', 'javascript:DateTimeShortcuts.handleCalendarQuickLink(' + num + ', 0);');
    114         today_link.appendChild(document.createTextNode(gettext('Today')));
    115         var cal_link = document.createElement('a');
    116         cal_link.setAttribute('href', 'javascript:DateTimeShortcuts.openCalendar(' + num + ');');
    117         quickElement('img', cal_link, '', 'src', DateTimeShortcuts.admin_media_prefix + 'img/admin/icon_calendar.gif', 'alt', gettext('Calendar'));
    118         shortcuts_span.appendChild(document.createTextNode('\240'));
    119         shortcuts_span.appendChild(today_link);
    120         shortcuts_span.appendChild(document.createTextNode('\240|\240'));
    121         shortcuts_span.appendChild(cal_link);
    122 
    123         // Create calendarbox div.
    124         //
    125         // Markup looks like:
    126         //
    127         // <div id="calendarbox3" class="calendarbox module">
    128         //     <h2>
    129         //           <a href="#" class="link-previous">&lsaquo;</a>
    130         //           <a href="#" class="link-next">&rsaquo;</a> February 2003
    131         //     </h2>
    132         //     <div class="calendar" id="calendarin3">
    133         //         <!-- (cal) -->
    134         //     </div>
    135         //     <div class="calendar-shortcuts">
    136         //          <a href="#">Yesterday</a> | <a href="#">Today</a> | <a href="#">Tomorrow</a>
    137         //     </div>
    138         //     <p class="calendar-cancel"><a href="#">Cancel</a></p>
    139         // </div>
    140         var cal_box = document.createElement('div');
    141         cal_box.style.display = 'none';
    142         cal_box.style.position = 'absolute';
    143         cal_box.style.left = findPosX(cal_link) + 17 + 'px';
    144         cal_box.style.top = findPosY(cal_link) - 75 + 'px';
    145         cal_box.className = 'calendarbox module';
    146         cal_box.setAttribute('id', DateTimeShortcuts.calendarDivName1 + num);
    147         document.body.appendChild(cal_box);
    148         addEvent(cal_box, 'click', DateTimeShortcuts.cancelEventPropagation);
    149 
    150         // next-prev links
    151         var cal_nav = quickElement('div', cal_box, '');
    152         var cal_nav_prev = quickElement('a', cal_nav, '<', 'href', 'javascript:DateTimeShortcuts.drawPrev('+num+');');
    153         cal_nav_prev.className = 'calendarnav-previous';
    154         var cal_nav_next = quickElement('a', cal_nav, '>', 'href', 'javascript:DateTimeShortcuts.drawNext('+num+');');
    155         cal_nav_next.className = 'calendarnav-next';
    156         cal_box.appendChild(cal_nav);
    157 
    158         // main box
    159         var cal_main = quickElement('div', cal_box, '', 'id', DateTimeShortcuts.calendarDivName2 + num);
    160         cal_main.className = 'calendar';
    161         DateTimeShortcuts.calendars[num] = new Calendar(DateTimeShortcuts.calendarDivName2 + num, DateTimeShortcuts.handleCalendarCallback(num));
    162         DateTimeShortcuts.calendars[num].drawCurrent();
    163 
    164         // calendar shortcuts
    165         var shortcuts = quickElement('div', cal_box, '');
    166         shortcuts.className = 'calendar-shortcuts';
    167         quickElement('a', shortcuts, gettext('Yesterday'), 'href', 'javascript:DateTimeShortcuts.handleCalendarQuickLink(' + num + ', -1);');
    168         shortcuts.appendChild(document.createTextNode('\240|\240'));
    169         quickElement('a', shortcuts, gettext('Today'), 'href', 'javascript:DateTimeShortcuts.handleCalendarQuickLink(' + num + ', 0);');
    170         shortcuts.appendChild(document.createTextNode('\240|\240'));
    171         quickElement('a', shortcuts, gettext('Tomorrow'), 'href', 'javascript:DateTimeShortcuts.handleCalendarQuickLink(' + num + ', +1);');
    172 
    173         // cancel bar
    174         var cancel_p = quickElement('p', cal_box, '');
    175         cancel_p.className = 'calendar-cancel';
    176         quickElement('a', cancel_p, gettext('Cancel'), 'href', 'javascript:DateTimeShortcuts.dismissCalendar(' + num + ');');
    177     },
    178     openCalendar: function(num) {
    179         document.getElementById(DateTimeShortcuts.calendarDivName1+num).style.display = 'block';
    180         addEvent(window, 'click', function() { DateTimeShortcuts.dismissCalendar(num); return true; });
    181     },
    182     dismissCalendar: function(num) {
    183         document.getElementById(DateTimeShortcuts.calendarDivName1+num).style.display = 'none';
    184     },
    185     drawPrev: function(num) {
    186         DateTimeShortcuts.calendars[num].drawPreviousMonth();
    187     },
    188     drawNext: function(num) {
    189         DateTimeShortcuts.calendars[num].drawNextMonth();
    190     },
    191     handleCalendarCallback: function(num) {
    192         return "function(y, m, d) { DateTimeShortcuts.calendarInputs["+num+"].value = y+'-'+m+'-'+d; document.getElementById(DateTimeShortcuts.calendarDivName1+"+num+").style.display='none';}";
    193     },
    194     handleCalendarQuickLink: function(num, offset) {
    195        var d = new Date();
    196        d.setDate(d.getDate() + offset)
    197        DateTimeShortcuts.calendarInputs[num].value = d.getISODate();
    198        DateTimeShortcuts.dismissCalendar(num);
    199     },
    200     cancelEventPropagation: function(e) {
    201         if (!e) var e = window.event;
    202         e.cancelBubble = true;
    203         if (e.stopPropagation) e.stopPropagation();
    204     }
    205 }
    206 
    207 addEvent(window, 'load', DateTimeShortcuts.init);
  • media/js/dojo/dojo.js

     
     1/*
     2        Copyright (c) 2004-2005, The Dojo Foundation
     3        All Rights Reserved.
     4
     5        Licensed under the Academic Free License version 2.1 or above OR the
     6        modified BSD license. For more information on Dojo licensing, see:
     7
     8                http://dojotoolkit.org/community/licensing.shtml
     9*/
     10
     11/*
     12        This is a compiled version of Dojo, built for deployment and not for
     13        development. To get an editable version, please visit:
     14
     15                http://dojotoolkit.org
     16
     17        for documentation and information on getting the source.
     18*/
     19
     20var dj_global=this;
     21function dj_undef(_1,_2){
     22if(!_2){
     23_2=dj_global;
     24}
     25return (typeof _2[_1]=="undefined");
     26}
     27if(dj_undef("djConfig")){
     28var djConfig={};
     29}
     30var dojo;
     31if(dj_undef("dojo")){
     32dojo={};
     33}
     34dojo.version={major:0,minor:2,patch:2,flag:"",revision:Number("$Rev: 2836 $".match(/[0-9]+/)[0]),toString:function(){
     35with(dojo.version){
     36return major+"."+minor+"."+patch+flag+" ("+revision+")";
     37}
     38}};
     39dojo.evalObjPath=function(_3,_4){
     40if(typeof _3!="string"){
     41return dj_global;
     42}
     43if(_3.indexOf(".")==-1){
     44if((dj_undef(_3,dj_global))&&(_4)){
     45dj_global[_3]={};
     46}
     47return dj_global[_3];
     48}
     49var _5=_3.split(/\./);
     50var _6=dj_global;
     51for(var i=0;i<_5.length;++i){
     52if(!_4){
     53_6=_6[_5[i]];
     54if((typeof _6=="undefined")||(!_6)){
     55return _6;
     56}
     57}else{
     58if(dj_undef(_5[i],_6)){
     59_6[_5[i]]={};
     60}
     61_6=_6[_5[i]];
     62}
     63}
     64return _6;
     65};
     66dojo.errorToString=function(_8){
     67return ((!dj_undef("message",_8))?_8.message:(dj_undef("description",_8)?_8:_8.description));
     68};
     69dojo.raise=function(_9,_a){
     70if(_a){
     71_9=_9+": "+dojo.errorToString(_a);
     72}
     73var he=dojo.hostenv;
     74if((!dj_undef("hostenv",dojo))&&(!dj_undef("println",dojo.hostenv))){
     75dojo.hostenv.println("FATAL: "+_9);
     76}
     77throw Error(_9);
     78};
     79dj_throw=dj_rethrow=function(m,e){
     80dojo.deprecated("dj_throw and dj_rethrow deprecated, use dojo.raise instead");
     81dojo.raise(m,e);
     82};
     83dojo.debug=function(){
     84if(!djConfig.isDebug){
     85return;
     86}
     87var _e=arguments;
     88if(dj_undef("println",dojo.hostenv)){
     89dojo.raise("dojo.debug not available (yet?)");
     90}
     91var _f=dj_global["jum"]&&!dj_global["jum"].isBrowser;
     92var s=[(_f?"":"DEBUG: ")];
     93for(var i=0;i<_e.length;++i){
     94if(!false&&_e[i] instanceof Error){
     95var msg="["+_e[i].name+": "+dojo.errorToString(_e[i])+(_e[i].fileName?", file: "+_e[i].fileName:"")+(_e[i].lineNumber?", line: "+_e[i].lineNumber:"")+"]";
     96}else{
     97try{
     98var msg=String(_e[i]);
     99}
     100catch(e){
     101if(dojo.render.html.ie){
     102var msg="[ActiveXObject]";
     103}else{
     104var msg="[unknown]";
     105}
     106}
     107}
     108s.push(msg);
     109}
     110if(_f){
     111jum.debug(s.join(" "));
     112}else{
     113dojo.hostenv.println(s.join(" "));
     114}
     115};
     116dojo.debugShallow=function(obj){
     117if(!djConfig.isDebug){
     118return;
     119}
     120dojo.debug("------------------------------------------------------------");
     121dojo.debug("Object: "+obj);
     122for(i in obj){
     123dojo.debug(i+": "+obj[i]);
     124}
     125dojo.debug("------------------------------------------------------------");
     126};
     127var dj_debug=dojo.debug;
     128function dj_eval(s){
     129return dj_global.eval?dj_global.eval(s):eval(s);
     130}
     131dj_unimplemented=dojo.unimplemented=function(_15,_16){
     132var _17="'"+_15+"' not implemented";
     133if((!dj_undef(_16))&&(_16)){
     134_17+=" "+_16;
     135}
     136dojo.raise(_17);
     137};
     138dj_deprecated=dojo.deprecated=function(_18,_19,_1a){
     139var _1b="DEPRECATED: "+_18;
     140if(_19){
     141_1b+=" "+_19;
     142}
     143if(_1a){
     144_1b+=" -- will be removed in version: "+_1a;
     145}
     146dojo.debug(_1b);
     147};
     148dojo.inherits=function(_1c,_1d){
     149if(typeof _1d!="function"){
     150dojo.raise("superclass: "+_1d+" borken");
     151}
     152_1c.prototype=new _1d();
     153_1c.prototype.constructor=_1c;
     154_1c.superclass=_1d.prototype;
     155_1c["super"]=_1d.prototype;
     156};
     157dj_inherits=function(_1e,_1f){
     158dojo.deprecated("dj_inherits deprecated, use dojo.inherits instead");
     159dojo.inherits(_1e,_1f);
     160};
     161dojo.render=(function(){
     162function vscaffold(_20,_21){
     163var tmp={capable:false,support:{builtin:false,plugin:false},prefixes:_20};
     164for(var x in _21){
     165tmp[x]=false;
     166}
     167return tmp;
     168}
     169return {name:"",ver:dojo.version,os:{win:false,linux:false,osx:false},html:vscaffold(["html"],["ie","opera","khtml","safari","moz"]),svg:vscaffold(["svg"],["corel","adobe","batik"]),vml:vscaffold(["vml"],["ie"]),swf:vscaffold(["Swf","Flash","Mm"],["mm"]),swt:vscaffold(["Swt"],["ibm"])};
     170})();
     171dojo.hostenv=(function(){
     172var _24={isDebug:false,allowQueryConfig:false,baseScriptUri:"",baseRelativePath:"",libraryScriptUri:"",iePreventClobber:false,ieClobberMinimal:true,preventBackButtonFix:true,searchIds:[],parseWidgets:true};
     173if(typeof djConfig=="undefined"){
     174djConfig=_24;
     175}else{
     176for(var _25 in _24){
     177if(typeof djConfig[_25]=="undefined"){
     178djConfig[_25]=_24[_25];
     179}
     180}
     181}
     182var djc=djConfig;
     183function _def(obj,_28,def){
     184return (dj_undef(_28,obj)?def:obj[_28]);
     185}
     186return {name_:"(unset)",version_:"(unset)",pkgFileName:"__package__",loading_modules_:{},loaded_modules_:{},addedToLoadingCount:[],removedFromLoadingCount:[],inFlightCount:0,modulePrefixes_:{dojo:{name:"dojo",value:"src"}},setModulePrefix:function(_2a,_2b){
     187this.modulePrefixes_[_2a]={name:_2a,value:_2b};
     188},getModulePrefix:function(_2c){
     189var mp=this.modulePrefixes_;
     190if((mp[_2c])&&(mp[_2c]["name"])){
     191return mp[_2c].value;
     192}
     193return _2c;
     194},getTextStack:[],loadUriStack:[],loadedUris:[],post_load_:false,modulesLoadedListeners:[],getName:function(){
     195return this.name_;
     196},getVersion:function(){
     197return this.version_;
     198},getText:function(uri){
     199dojo.unimplemented("getText","uri="+uri);
     200},getLibraryScriptUri:function(){
     201dojo.unimplemented("getLibraryScriptUri","");
     202}};
     203})();
     204dojo.hostenv.getBaseScriptUri=function(){
     205if(djConfig.baseScriptUri.length){
     206return djConfig.baseScriptUri;
     207}
     208var uri=new String(djConfig.libraryScriptUri||djConfig.baseRelativePath);
     209if(!uri){
     210dojo.raise("Nothing returned by getLibraryScriptUri(): "+uri);
     211}
     212var _30=uri.lastIndexOf("/");
     213djConfig.baseScriptUri=djConfig.baseRelativePath;
     214return djConfig.baseScriptUri;
     215};
     216dojo.hostenv.setBaseScriptUri=function(uri){
     217djConfig.baseScriptUri=uri;
     218};
     219dojo.hostenv.loadPath=function(_32,_33,cb){
     220if((_32.charAt(0)=="/")||(_32.match(/^\w+:/))){
     221dojo.raise("relpath '"+_32+"'; must be relative");
     222}
     223var uri=this.getBaseScriptUri()+_32;
     224if(djConfig.cacheBust&&dojo.render.html.capable){
     225uri+="?"+String(djConfig.cacheBust).replace(/\W+/g,"");
     226}
     227try{
     228return ((!_33)?this.loadUri(uri,cb):this.loadUriAndCheck(uri,_33,cb));
     229}
     230catch(e){
     231dojo.debug(e);
     232return false;
     233}
     234};
     235dojo.hostenv.loadUri=function(uri,cb){
     236if(this.loadedUris[uri]){
     237return;
     238}
     239var _38=this.getText(uri,null,true);
     240if(_38==null){
     241return 0;
     242}
     243this.loadedUris[uri]=true;
     244var _39=dj_eval(_38);
     245return 1;
     246};
     247dojo.hostenv.loadUriAndCheck=function(uri,_3b,cb){
     248var ok=true;
     249try{
     250ok=this.loadUri(uri,cb);
     251}
     252catch(e){
     253dojo.debug("failed loading ",uri," with error: ",e);
     254}
     255return ((ok)&&(this.findModule(_3b,false)))?true:false;
     256};
     257dojo.loaded=function(){
     258};
     259dojo.hostenv.loaded=function(){
     260this.post_load_=true;
     261var mll=this.modulesLoadedListeners;
     262for(var x=0;x<mll.length;x++){
     263mll[x]();
     264}
     265dojo.loaded();
     266};
     267dojo.addOnLoad=function(obj,_41){
     268if(arguments.length==1){
     269dojo.hostenv.modulesLoadedListeners.push(obj);
     270}else{
     271if(arguments.length>1){
     272dojo.hostenv.modulesLoadedListeners.push(function(){
     273obj[_41]();
     274});
     275}
     276}
     277};
     278dojo.hostenv.modulesLoaded=function(){
     279if(this.post_load_){
     280return;
     281}
     282if((this.loadUriStack.length==0)&&(this.getTextStack.length==0)){
     283if(this.inFlightCount>0){
     284dojo.debug("files still in flight!");
     285return;
     286}
     287if(typeof setTimeout=="object"){
     288setTimeout("dojo.hostenv.loaded();",0);
     289}else{
     290dojo.hostenv.loaded();
     291}
     292}
     293};
     294dojo.hostenv.moduleLoaded=function(_42){
     295var _43=dojo.evalObjPath((_42.split(".").slice(0,-1)).join("."));
     296this.loaded_modules_[(new String(_42)).toLowerCase()]=_43;
     297};
     298dojo.hostenv._global_omit_module_check=false;
     299dojo.hostenv.loadModule=function(_44,_45,_46){
     300if(!_44){
     301return;
     302}
     303_46=this._global_omit_module_check||_46;
     304var _47=this.findModule(_44,false);
     305if(_47){
     306return _47;
     307}
     308if(dj_undef(_44,this.loading_modules_)){
     309this.addedToLoadingCount.push(_44);
     310}
     311this.loading_modules_[_44]=1;
     312var _48=_44.replace(/\./g,"/")+".js";
     313var _49=_44.split(".");
     314var _4a=_44.split(".");
     315for(var i=_49.length-1;i>0;i--){
     316var _4c=_49.slice(0,i).join(".");
     317var _4d=this.getModulePrefix(_4c);
     318if(_4d!=_4c){
     319_49.splice(0,i,_4d);
     320break;
     321}
     322}
     323var _4e=_49[_49.length-1];
     324if(_4e=="*"){
     325_44=(_4a.slice(0,-1)).join(".");
     326while(_49.length){
     327_49.pop();
     328_49.push(this.pkgFileName);
     329_48=_49.join("/")+".js";
     330if(_48.charAt(0)=="/"){
     331_48=_48.slice(1);
     332}
     333ok=this.loadPath(_48,((!_46)?_44:null));
     334if(ok){
     335break;
     336}
     337_49.pop();
     338}
     339}else{
     340_48=_49.join("/")+".js";
     341_44=_4a.join(".");
     342var ok=this.loadPath(_48,((!_46)?_44:null));
     343if((!ok)&&(!_45)){
     344_49.pop();
     345while(_49.length){
     346_48=_49.join("/")+".js";
     347ok=this.loadPath(_48,((!_46)?_44:null));
     348if(ok){
     349break;
     350}
     351_49.pop();
     352_48=_49.join("/")+"/"+this.pkgFileName+".js";
     353if(_48.charAt(0)=="/"){
     354_48=_48.slice(1);
     355}
     356ok=this.loadPath(_48,((!_46)?_44:null));
     357if(ok){
     358break;
     359}
     360}
     361}
     362if((!ok)&&(!_46)){
     363dojo.raise("Could not load '"+_44+"'; last tried '"+_48+"'");
     364}
     365}
     366if(!_46){
     367_47=this.findModule(_44,false);
     368if(!_47){
     369dojo.raise("symbol '"+_44+"' is not defined after loading '"+_48+"'");
     370}
     371}
     372return _47;
     373};
     374dojo.hostenv.startPackage=function(_50){
     375var _51=_50.split(/\./);
     376if(_51[_51.length-1]=="*"){
     377_51.pop();
     378}
     379return dojo.evalObjPath(_51.join("."),true);
     380};
     381dojo.hostenv.findModule=function(_52,_53){
     382var lmn=(new String(_52)).toLowerCase();
     383if(this.loaded_modules_[lmn]){
     384return this.loaded_modules_[lmn];
     385}
     386var _55=dojo.evalObjPath(_52);
     387if((_52)&&(typeof _55!="undefined")&&(_55)){
     388this.loaded_modules_[lmn]=_55;
     389return _55;
     390}
     391if(_53){
     392dojo.raise("no loaded module named '"+_52+"'");
     393}
     394return null;
     395};
     396if(typeof window=="undefined"){
     397dojo.raise("no window object");
     398}
     399(function(){
     400if(djConfig.allowQueryConfig){
     401var _56=document.location.toString();
     402var _57=_56.split("?",2);
     403if(_57.length>1){
     404var _58=_57[1];
     405var _59=_58.split("&");
     406for(var x in _59){
     407var sp=_59[x].split("=");
     408if((sp[0].length>9)&&(sp[0].substr(0,9)=="djConfig.")){
     409var opt=sp[0].substr(9);
     410try{
     411djConfig[opt]=eval(sp[1]);
     412}
     413catch(e){
     414djConfig[opt]=sp[1];
     415}
     416}
     417}
     418}
     419}
     420if(((djConfig["baseScriptUri"]=="")||(djConfig["baseRelativePath"]==""))&&(document&&document.getElementsByTagName)){
     421var _5d=document.getElementsByTagName("script");
     422var _5e=/(__package__|dojo)\.js([\?\.]|$)/i;
     423for(var i=0;i<_5d.length;i++){
     424var src=_5d[i].getAttribute("src");
     425if(!src){
     426continue;
     427}
     428var m=src.match(_5e);
     429if(m){
     430root=src.substring(0,m.index);
     431if(!this["djConfig"]){
     432djConfig={};
     433}
     434if(djConfig["baseScriptUri"]==""){
     435djConfig["baseScriptUri"]=root;
     436}
     437if(djConfig["baseRelativePath"]==""){
     438djConfig["baseRelativePath"]=root;
     439}
     440break;
     441}
     442}
     443}
     444var dr=dojo.render;
     445var drh=dojo.render.html;
     446var dua=drh.UA=navigator.userAgent;
     447var dav=drh.AV=navigator.appVersion;
     448var t=true;
     449var f=false;
     450drh.capable=t;
     451drh.support.builtin=t;
     452dr.ver=parseFloat(drh.AV);
     453dr.os.mac=dav.indexOf("Macintosh")>=0;
     454dr.os.win=dav.indexOf("Windows")>=0;
     455dr.os.linux=dav.indexOf("X11")>=0;
     456drh.opera=dua.indexOf("Opera")>=0;
     457drh.khtml=(dav.indexOf("Konqueror")>=0)||(dav.indexOf("Safari")>=0);
     458drh.safari=dav.indexOf("Safari")>=0;
     459var _68=dua.indexOf("Gecko");
     460drh.mozilla=drh.moz=(_68>=0)&&(!drh.khtml);
     461if(drh.mozilla){
     462drh.geckoVersion=dua.substring(_68+6,_68+14);
     463}
     464drh.ie=(document.all)&&(!drh.opera);
     465drh.ie50=drh.ie&&dav.indexOf("MSIE 5.0")>=0;
     466drh.ie55=drh.ie&&dav.indexOf("MSIE 5.5")>=0;
     467drh.ie60=drh.ie&&dav.indexOf("MSIE 6.0")>=0;
     468dr.vml.capable=drh.ie;
     469dr.svg.capable=f;
     470dr.svg.support.plugin=f;
     471dr.svg.support.builtin=f;
     472dr.svg.adobe=f;
     473if(document.implementation&&document.implementation.hasFeature&&document.implementation.hasFeature("org.w3c.dom.svg","1.0")){
     474dr.svg.capable=t;
     475dr.svg.support.builtin=t;
     476dr.svg.support.plugin=f;
     477dr.svg.adobe=f;
     478}else{
     479if(navigator.mimeTypes&&navigator.mimeTypes.length>0){
     480var _69=navigator.mimeTypes["image/svg+xml"]||navigator.mimeTypes["image/svg"]||navigator.mimeTypes["image/svg-xml"];
     481if(_69){
     482dr.svg.adobe=_69&&_69.enabledPlugin&&_69.enabledPlugin.description&&(_69.enabledPlugin.description.indexOf("Adobe")>-1);
     483if(dr.svg.adobe){
     484dr.svg.capable=t;
     485dr.svg.support.plugin=t;
     486}
     487}
     488}else{
     489if(drh.ie&&dr.os.win){
     490var _69=f;
     491try{
     492var _6a=new ActiveXObject("Adobe.SVGCtl");
     493_69=t;
     494}
     495catch(e){
     496}
     497if(_69){
     498dr.svg.capable=t;
     499dr.svg.support.plugin=t;
     500dr.svg.adobe=t;
     501}
     502}else{
     503dr.svg.capable=f;
     504dr.svg.support.plugin=f;
     505dr.svg.adobe=f;
     506}
     507}
     508}
     509})();
     510dojo.hostenv.startPackage("dojo.hostenv");
     511dojo.hostenv.name_="browser";
     512dojo.hostenv.searchIds=[];
     513var DJ_XMLHTTP_PROGIDS=["Msxml2.XMLHTTP","Microsoft.XMLHTTP","Msxml2.XMLHTTP.4.0"];
     514dojo.hostenv.getXmlhttpObject=function(){
     515var _6b=null;
     516var _6c=null;
     517try{
     518_6b=new XMLHttpRequest();
     519}
     520catch(e){
     521}
     522if(!_6b){
     523for(var i=0;i<3;++i){
     524var _6e=DJ_XMLHTTP_PROGIDS[i];
     525try{
     526_6b=new ActiveXObject(_6e);
     527}
     528catch(e){
     529_6c=e;
     530}
     531if(_6b){
     532DJ_XMLHTTP_PROGIDS=[_6e];
     533break;
     534}
     535}
     536}
     537if(!_6b){
     538return dojo.raise("XMLHTTP not available",_6c);
     539}
     540return _6b;
     541};
     542dojo.hostenv.getText=function(uri,_70,_71){
     543var _72=this.getXmlhttpObject();
     544if(_70){
     545_72.onreadystatechange=function(){
     546if((4==_72.readyState)&&(_72["status"])){
     547if(_72.status==200){
     548_70(_72.responseText);
     549}
     550}
     551};
     552}
     553_72.open("GET",uri,_70?true:false);
     554_72.send(null);
     555if(_70){
     556return null;
     557}
     558return _72.responseText;
     559};
     560dojo.hostenv.defaultDebugContainerId="dojoDebug";
     561dojo.hostenv._println_buffer=[];
     562dojo.hostenv._println_safe=false;
     563dojo.hostenv.println=function(_73){
     564if(!dojo.hostenv._println_safe){
     565dojo.hostenv._println_buffer.push(_73);
     566}else{
     567try{
     568var _74=document.getElementById(djConfig.debugContainerId?djConfig.debugContainerId:dojo.hostenv.defaultDebugContainerId);
     569if(!_74){
     570_74=document.getElementsByTagName("body")[0]||document.body;
     571}
     572var div=document.createElement("div");
     573div.appendChild(document.createTextNode(_73));
     574_74.appendChild(div);
     575}
     576catch(e){
     577try{
     578document.write("<div>"+_73+"</div>");
     579}
     580catch(e2){
     581window.status=_73;
     582}
     583}
     584}
     585};
     586dojo.addOnLoad(function(){
     587dojo.hostenv._println_safe=true;
     588while(dojo.hostenv._println_buffer.length>0){
     589dojo.hostenv.println(dojo.hostenv._println_buffer.shift());
     590}
     591});
     592function dj_addNodeEvtHdlr(_76,_77,fp,_79){
     593var _7a=_76["on"+_77]||function(){
     594};
     595_76["on"+_77]=function(){
     596fp.apply(_76,arguments);
     597_7a.apply(_76,arguments);
     598};
     599return true;
     600}
     601dj_addNodeEvtHdlr(window,"load",function(){
     602if(dojo.render.html.ie){
     603dojo.hostenv.makeWidgets();
     604}
     605dojo.hostenv.modulesLoaded();
     606});
     607dojo.hostenv.makeWidgets=function(){
     608var _7b=[];
     609if(djConfig.searchIds&&djConfig.searchIds.length>0){
     610_7b=_7b.concat(djConfig.searchIds);
     611}
     612if(dojo.hostenv.searchIds&&dojo.hostenv.searchIds.length>0){
     613_7b=_7b.concat(dojo.hostenv.searchIds);
     614}
     615if((djConfig.parseWidgets)||(_7b.length>0)){
     616if(dojo.evalObjPath("dojo.widget.Parse")){
     617try{
     618var _7c=new dojo.xml.Parse();
     619if(_7b.length>0){
     620for(var x=0;x<_7b.length;x++){
     621var _7e=document.getElementById(_7b[x]);
     622if(!_7e){
     623continue;
     624}
     625var _7f=_7c.parseElement(_7e,null,true);
     626dojo.widget.getParser().createComponents(_7f);
     627}
     628}else{
     629if(djConfig.parseWidgets){
     630var _7f=_7c.parseElement(document.getElementsByTagName("body")[0]||document.body,null,true);
     631dojo.widget.getParser().createComponents(_7f);
     632}
     633}
     634}
     635catch(e){
     636dojo.debug("auto-build-widgets error:",e);
     637}
     638}
     639}
     640};
     641dojo.hostenv.modulesLoadedListeners.push(function(){
     642if(!dojo.render.html.ie){
     643dojo.hostenv.makeWidgets();
     644}
     645});
     646try{
     647if(dojo.render.html.ie){
     648document.write("<style>v:*{ behavior:url(#default#VML); }</style>");
     649document.write("<xml:namespace ns=\"urn:schemas-microsoft-com:vml\" prefix=\"v\"/>");
     650}
     651}
     652catch(e){
     653}
     654dojo.hostenv.writeIncludes=function(){
     655};
     656dojo.hostenv.byId=dojo.byId=function(id,doc){
     657if(typeof id=="string"||id instanceof String){
     658if(!doc){
     659doc=document;
     660}
     661return doc.getElementById(id);
     662}
     663return id;
     664};
     665dojo.hostenv.byIdArray=dojo.byIdArray=function(){
     666var ids=[];
     667for(var i=0;i<arguments.length;i++){
     668if((arguments[i] instanceof Array)||(typeof arguments[i]=="array")){
     669for(var j=0;j<arguments[i].length;j++){
     670ids=ids.concat(dojo.hostenv.byIdArray(arguments[i][j]));
     671}
     672}else{
     673ids.push(dojo.hostenv.byId(arguments[i]));
     674}
     675}
     676return ids;
     677};
     678dojo.hostenv.conditionalLoadModule=function(_85){
     679var _86=_85["common"]||[];
     680var _87=(_85[dojo.hostenv.name_])?_86.concat(_85[dojo.hostenv.name_]||[]):_86.concat(_85["default"]||[]);
     681for(var x=0;x<_87.length;x++){
     682var _89=_87[x];
     683if(_89.constructor==Array){
     684dojo.hostenv.loadModule.apply(dojo.hostenv,_89);
     685}else{
     686dojo.hostenv.loadModule(_89);
     687}
     688}
     689};
     690dojo.hostenv.require=dojo.hostenv.loadModule;
     691dojo.require=function(){
     692dojo.hostenv.loadModule.apply(dojo.hostenv,arguments);
     693};
     694dojo.requireAfter=dojo.require;
     695dojo.requireIf=function(){
     696if((arguments[0]===true)||(arguments[0]=="common")||(dojo.render[arguments[0]].capable)){
     697var _8a=[];
     698for(var i=1;i<arguments.length;i++){
     699_8a.push(arguments[i]);
     700}
     701dojo.require.apply(dojo,_8a);
     702}
     703};
     704dojo.requireAfterIf=dojo.requireIf;
     705dojo.conditionalRequire=dojo.requireIf;
     706dojo.kwCompoundRequire=function(){
     707dojo.hostenv.conditionalLoadModule.apply(dojo.hostenv,arguments);
     708};
     709dojo.hostenv.provide=dojo.hostenv.startPackage;
     710dojo.provide=function(){
     711return dojo.hostenv.startPackage.apply(dojo.hostenv,arguments);
     712};
     713dojo.setModulePrefix=function(_8c,_8d){
     714return dojo.hostenv.setModulePrefix(_8c,_8d);
     715};
     716dojo.profile={start:function(){
     717},end:function(){
     718},dump:function(){
     719}};
     720dojo.exists=function(obj,_8f){
     721var p=_8f.split(".");
     722for(var i=0;i<p.length;i++){
     723if(!(obj[p[i]])){
     724return false;
     725}
     726obj=obj[p[i]];
     727}
     728return true;
     729};
     730dojo.provide("dojo.lang");
     731dojo.provide("dojo.AdapterRegistry");
     732dojo.provide("dojo.lang.Lang");
     733dojo.lang.mixin=function(obj,_93){
     734var _94={};
     735for(var x in _93){
     736if(typeof _94[x]=="undefined"||_94[x]!=_93[x]){
     737obj[x]=_93[x];
     738}
     739}
     740if(dojo.render.html.ie&&dojo.lang.isFunction(_93["toString"])&&_93["toString"]!=obj["toString"]){
     741obj.toString=_93.toString;
     742}
     743return obj;
     744};
     745dojo.lang.extend=function(_96,_97){
     746this.mixin(_96.prototype,_97);
     747};
     748dojo.lang.extendPrototype=function(obj,_99){
     749this.extend(obj.constructor,_99);
     750};
     751dojo.lang.anonCtr=0;
     752dojo.lang.anon={};
     753dojo.lang.nameAnonFunc=function(_9a,_9b){
     754var nso=(_9b||dojo.lang.anon);
     755if((dj_global["djConfig"])&&(djConfig["slowAnonFuncLookups"]==true)){
     756for(var x in nso){
     757if(nso[x]===_9a){
     758return x;
     759}
     760}
     761}
     762var ret="__"+dojo.lang.anonCtr++;
     763while(typeof nso[ret]!="undefined"){
     764ret="__"+dojo.lang.anonCtr++;
     765}
     766nso[ret]=_9a;
     767return ret;
     768};
     769dojo.lang.hitch=function(_9f,_a0){
     770if(dojo.lang.isString(_a0)){
     771var fcn=_9f[_a0];
     772}else{
     773var fcn=_a0;
     774}
     775return function(){
     776return fcn.apply(_9f,arguments);
     777};
     778};
     779dojo.lang.forward=function(_a2){
     780return function(){
     781return this[_a2].apply(this,arguments);
     782};
     783};
     784dojo.lang.curry=function(ns,_a4){
     785var _a5=[];
     786ns=ns||dj_global;
     787if(dojo.lang.isString(_a4)){
     788_a4=ns[_a4];
     789}
     790for(var x=2;x<arguments.length;x++){
     791_a5.push(arguments[x]);
     792}
     793var _a7=_a4.length-_a5.length;
     794function gather(_a8,_a9,_aa){
     795var _ab=_aa;
     796var _ac=_a9.slice(0);
     797for(var x=0;x<_a8.length;x++){
     798_ac.push(_a8[x]);
     799}
     800_aa=_aa-_a8.length;
     801if(_aa<=0){
     802var res=_a4.apply(ns,_ac);
     803_aa=_ab;
     804return res;
     805}else{
     806return function(){
     807return gather(arguments,_ac,_aa);
     808};
     809}
     810}
     811return gather([],_a5,_a7);
     812};
     813dojo.lang.curryArguments=function(ns,_b0,_b1,_b2){
     814var _b3=[];
     815var x=_b2||0;
     816for(x=_b2;x<_b1.length;x++){
     817_b3.push(_b1[x]);
     818}
     819return dojo.lang.curry.apply(dojo.lang,[ns,_b0].concat(_b3));
     820};
     821dojo.lang.setTimeout=function(_b5,_b6){
     822var _b7=window,argsStart=2;
     823if(!dojo.lang.isFunction(_b5)){
     824_b7=_b5;
     825_b5=_b6;
     826_b6=arguments[2];
     827argsStart++;
     828}
     829if(dojo.lang.isString(_b5)){
     830_b5=_b7[_b5];
     831}
     832var _b8=[];
     833for(var i=argsStart;i<arguments.length;i++){
     834_b8.push(arguments[i]);
     835}
     836return setTimeout(function(){
     837_b5.apply(_b7,_b8);
     838},_b6);
     839};
     840dojo.lang.isObject=function(wh){
     841return typeof wh=="object"||dojo.lang.isArray(wh)||dojo.lang.isFunction(wh);
     842};
     843dojo.lang.isArray=function(wh){
     844return (wh instanceof Array||typeof wh=="array");
     845};
     846dojo.lang.isArrayLike=function(wh){
     847if(dojo.lang.isString(wh)){
     848return false;
     849}
     850if(dojo.lang.isArray(wh)){
     851return true;
     852}
     853if(typeof wh!="undefined"&&wh&&dojo.lang.isNumber(wh.length)&&isFinite(wh.length)){
     854return true;
     855}
     856return false;
     857};
     858dojo.lang.isFunction=function(wh){
     859return (wh instanceof Function||typeof wh=="function");
     860};
     861dojo.lang.isString=function(wh){
     862return (wh instanceof String||typeof wh=="string");
     863};
     864dojo.lang.isAlien=function(wh){
     865return !dojo.lang.isFunction()&&/\{\s*\[native code\]\s*\}/.test(String(wh));
     866};
     867dojo.lang.isBoolean=function(wh){
     868return (wh instanceof Boolean||typeof wh=="boolean");
     869};
     870dojo.lang.isNumber=function(wh){
     871return (wh instanceof Number||typeof wh=="number");
     872};
     873dojo.lang.isUndefined=function(wh){
     874return ((wh==undefined)&&(typeof wh=="undefined"));
     875};
     876dojo.lang.whatAmI=function(wh){
     877try{
     878if(dojo.lang.isArray(wh)){
     879return "array";
     880}
     881if(dojo.lang.isFunction(wh)){
     882return "function";
     883}
     884if(dojo.lang.isString(wh)){
     885return "string";
     886}
     887if(dojo.lang.isNumber(wh)){
     888return "number";
     889}
     890if(dojo.lang.isBoolean(wh)){
     891return "boolean";
     892}
     893if(dojo.lang.isAlien(wh)){
     894return "alien";
     895}
     896if(dojo.lang.isUndefined(wh)){
     897return "undefined";
     898}
     899for(var _c4 in dojo.lang.whatAmI.custom){
     900if(dojo.lang.whatAmI.custom[_c4](wh)){
     901return _c4;
     902}
     903}
     904if(dojo.lang.isObject(wh)){
     905return "object";
     906}
     907}
     908catch(E){
     909}
     910return "unknown";
     911};
     912dojo.lang.whatAmI.custom={};
     913dojo.lang.find=function(arr,val,_c7){
     914if(!dojo.lang.isArrayLike(arr)&&dojo.lang.isArrayLike(val)){
     915var a=arr;
     916arr=val;
     917val=a;
     918}
     919var _c9=dojo.lang.isString(arr);
     920if(_c9){
     921arr=arr.split("");
     922}
     923if(_c7){
     924for(var i=0;i<arr.length;++i){
     925if(arr[i]===val){
     926return i;
     927}
     928}
     929}else{
     930for(var i=0;i<arr.length;++i){
     931if(arr[i]==val){
     932return i;
     933}
     934}
     935}
     936return -1;
     937};
     938dojo.lang.indexOf=dojo.lang.find;
     939dojo.lang.findLast=function(arr,val,_cd){
     940if(!dojo.lang.isArrayLike(arr)&&dojo.lang.isArrayLike(val)){
     941var a=arr;
     942arr=val;
     943val=a;
     944}
     945var _cf=dojo.lang.isString(arr);
     946if(_cf){
     947arr=arr.split("");
     948}
     949if(_cd){
     950for(var i=arr.length-1;i>=0;i--){
     951if(arr[i]===val){
     952return i;
     953}
     954}
     955}else{
     956for(var i=arr.length-1;i>=0;i--){
     957if(arr[i]==val){
     958return i;
     959}
     960}
     961}
     962return -1;
     963};
     964dojo.lang.lastIndexOf=dojo.lang.findLast;
     965dojo.lang.inArray=function(arr,val){
     966return dojo.lang.find(arr,val)>-1;
     967};
     968dojo.lang.getNameInObj=function(ns,_d4){
     969if(!ns){
     970ns=dj_global;
     971}
     972for(var x in ns){
     973if(ns[x]===_d4){
     974return new String(x);
     975}
     976}
     977return null;
     978};
     979dojo.lang.has=function(obj,_d7){
     980return (typeof obj[_d7]!=="undefined");
     981};
     982dojo.lang.isEmpty=function(obj){
     983if(dojo.lang.isObject(obj)){
     984var tmp={};
     985var _da=0;
     986for(var x in obj){
     987if(obj[x]&&(!tmp[x])){
     988_da++;
     989break;
     990}
     991}
     992return (_da==0);
     993}else{
     994if(dojo.lang.isArrayLike(obj)||dojo.lang.isString(obj)){
     995return obj.length==0;
     996}
     997}
     998};
     999dojo.lang.forEach=function(arr,_dd,_de){
     1000var _df=dojo.lang.isString(arr);
     1001if(_df){
     1002arr=arr.split("");
     1003}
     1004var il=arr.length;
     1005for(var i=0;i<((_de)?il:arr.length);i++){
     1006if(_dd(arr[i],i,arr)=="break"){
     1007break;
     1008}
     1009}
     1010};
     1011dojo.lang.map=function(arr,obj,_e4){
     1012var _e5=dojo.lang.isString(arr);
     1013if(_e5){
     1014arr=arr.split("");
     1015}
     1016if(dojo.lang.isFunction(obj)&&(!_e4)){
     1017_e4=obj;
     1018obj=dj_global;
     1019}else{
     1020if(dojo.lang.isFunction(obj)&&_e4){
     1021var _e6=obj;
     1022obj=_e4;
     1023_e4=_e6;
     1024}
     1025}
     1026if(Array.map){
     1027var _e7=Array.map(arr,_e4,obj);
     1028}else{
     1029var _e7=[];
     1030for(var i=0;i<arr.length;++i){
     1031_e7.push(_e4.call(obj,arr[i]));
     1032}
     1033}
     1034if(_e5){
     1035return _e7.join("");
     1036}else{
     1037return _e7;
     1038}
     1039};
     1040dojo.lang.tryThese=function(){
     1041for(var x=0;x<arguments.length;x++){
     1042try{
     1043if(typeof arguments[x]=="function"){
     1044var ret=(arguments[x]());
     1045if(ret){
     1046return ret;
     1047}
     1048}
     1049}
     1050catch(e){
     1051dojo.debug(e);
     1052}
     1053}
     1054};
     1055dojo.lang.delayThese=function(_eb,cb,_ed,_ee){
     1056if(!_eb.length){
     1057if(typeof _ee=="function"){
     1058_ee();
     1059}
     1060return;
     1061}
     1062if((typeof _ed=="undefined")&&(typeof cb=="number")){
     1063_ed=cb;
     1064cb=function(){
     1065};
     1066}else{
     1067if(!cb){
     1068cb=function(){
     1069};
     1070if(!_ed){
     1071_ed=0;
     1072}
     1073}
     1074}
     1075setTimeout(function(){
     1076(_eb.shift())();
     1077cb();
     1078dojo.lang.delayThese(_eb,cb,_ed,_ee);
     1079},_ed);
     1080};
     1081dojo.lang.shallowCopy=function(obj){
     1082var ret={},key;
     1083for(key in obj){
     1084if(dojo.lang.isUndefined(ret[key])){
     1085ret[key]=obj[key];
     1086}
     1087}
     1088return ret;
     1089};
     1090dojo.lang.every=function(arr,_f2,_f3){
     1091var _f4=dojo.lang.isString(arr);
     1092if(_f4){
     1093arr=arr.split("");
     1094}
     1095if(Array.every){
     1096return Array.every(arr,_f2,_f3);
     1097}else{
     1098if(!_f3){
     1099if(arguments.length>=3){
     1100dojo.raise("thisObject doesn't exist!");
     1101}
     1102_f3=dj_global;
     1103}
     1104for(var i=0;i<arr.length;i++){
     1105if(!_f2.call(_f3,arr[i],i,arr)){
     1106return false;
     1107}
     1108}
     1109return true;
     1110}
     1111};
     1112dojo.lang.some=function(arr,_f7,_f8){
     1113var _f9=dojo.lang.isString(arr);
     1114if(_f9){
     1115arr=arr.split("");
     1116}
     1117if(Array.some){
     1118return Array.some(arr,_f7,_f8);
     1119}else{
     1120if(!_f8){
     1121if(arguments.length>=3){
     1122dojo.raise("thisObject doesn't exist!");
     1123}
     1124_f8=dj_global;
     1125}
     1126for(var i=0;i<arr.length;i++){
     1127if(_f7.call(_f8,arr[i],i,arr)){
     1128return true;
     1129}
     1130}
     1131return false;
     1132}
     1133};
     1134dojo.lang.filter=function(arr,_fc,_fd){
     1135var _fe=dojo.lang.isString(arr);
     1136if(_fe){
     1137arr=arr.split("");
     1138}
     1139if(Array.filter){
     1140var _ff=Array.filter(arr,_fc,_fd);
     1141}else{
     1142if(!_fd){
     1143if(arguments.length>=3){
     1144dojo.raise("thisObject doesn't exist!");
     1145}
     1146_fd=dj_global;
     1147}
     1148var _ff=[];
     1149for(var i=0;i<arr.length;i++){
     1150if(_fc.call(_fd,arr[i],i,arr)){
     1151_ff.push(arr[i]);
     1152}
     1153}
     1154}
     1155if(_fe){
     1156return _ff.join("");
     1157}else{
     1158return _ff;
     1159}
     1160};
     1161dojo.AdapterRegistry=function(){
     1162this.pairs=[];
     1163};
     1164dojo.lang.extend(dojo.AdapterRegistry,{register:function(name,_102,wrap,_104){
     1165if(_104){
     1166this.pairs.unshift([name,_102,wrap]);
     1167}else{
     1168this.pairs.push([name,_102,wrap]);
     1169}
     1170},match:function(){
     1171for(var i=0;i<this.pairs.length;i++){
     1172var pair=this.pairs[i];
     1173if(pair[1].apply(this,arguments)){
     1174return pair[2].apply(this,arguments);
     1175}
     1176}
     1177throw new Error("No match found");
     1178},unregister:function(name){
     1179for(var i=0;i<this.pairs.length;i++){
     1180var pair=this.pairs[i];
     1181if(pair[0]==name){
     1182this.pairs.splice(i,1);
     1183return true;
     1184}
     1185}
     1186return false;
     1187}});
     1188dojo.lang.reprRegistry=new dojo.AdapterRegistry();
     1189dojo.lang.registerRepr=function(name,_10b,wrap,_10d){
     1190dojo.lang.reprRegistry.register(name,_10b,wrap,_10d);
     1191};
     1192dojo.lang.repr=function(obj){
     1193if(typeof (obj)=="undefined"){
     1194return "undefined";
     1195}else{
     1196if(obj===null){
     1197return "null";
     1198}
     1199}
     1200try{
     1201if(typeof (obj["__repr__"])=="function"){
     1202return obj["__repr__"]();
     1203}else{
     1204if((typeof (obj["repr"])=="function")&&(obj.repr!=arguments.callee)){
     1205return obj["repr"]();
     1206}
     1207}
     1208return dojo.lang.reprRegistry.match(obj);
     1209}
     1210catch(e){
     1211if(typeof (obj.NAME)=="string"&&(obj.toString==Function.prototype.toString||obj.toString==Object.prototype.toString)){
     1212return o.NAME;
     1213}
     1214}
     1215if(typeof (obj)=="function"){
     1216obj=(obj+"").replace(/^\s+/,"");
     1217var idx=obj.indexOf("{");
     1218if(idx!=-1){
     1219obj=obj.substr(0,idx)+"{...}";
     1220}
     1221}
     1222return obj+"";
     1223};
     1224dojo.lang.reprArrayLike=function(arr){
     1225try{
     1226var na=dojo.lang.map(arr,dojo.lang.repr);
     1227return "["+na.join(", ")+"]";
     1228}
     1229catch(e){
     1230}
     1231};
     1232dojo.lang.reprString=function(str){
     1233return ("\""+str.replace(/(["\\])/g,"\\$1")+"\"").replace(/[\f]/g,"\\f").replace(/[\b]/g,"\\b").replace(/[\n]/g,"\\n").replace(/[\t]/g,"\\t").replace(/[\r]/g,"\\r");
     1234};
     1235dojo.lang.reprNumber=function(num){
     1236return num+"";
     1237};
     1238(function(){
     1239var m=dojo.lang;
     1240m.registerRepr("arrayLike",m.isArrayLike,m.reprArrayLike);
     1241m.registerRepr("string",m.isString,m.reprString);
     1242m.registerRepr("numbers",m.isNumber,m.reprNumber);
     1243m.registerRepr("boolean",m.isBoolean,m.reprNumber);
     1244})();
     1245dojo.lang.unnest=function(){
     1246var out=[];
     1247for(var i=0;i<arguments.length;i++){
     1248if(dojo.lang.isArrayLike(arguments[i])){
     1249var add=dojo.lang.unnest.apply(this,arguments[i]);
     1250out=out.concat(add);
     1251}else{
     1252out.push(arguments[i]);
     1253}
     1254}
     1255return out;
     1256};
     1257dojo.lang.firstValued=function(){
     1258for(var i=0;i<arguments.length;i++){
     1259if(typeof arguments[i]!="undefined"){
     1260return arguments[i];
     1261}
     1262}
     1263return undefined;
     1264};
     1265dojo.lang.toArray=function(_119,_11a){
     1266var _11b=[];
     1267for(var i=_11a||0;i<_119.length;i++){
     1268_11b.push(_119[i]);
     1269}
     1270return _11b;
     1271};
     1272dojo.provide("dojo.string");
     1273dojo.require("dojo.lang");
     1274dojo.string.trim=function(str,wh){
     1275if(!dojo.lang.isString(str)){
     1276return str;
     1277}
     1278if(!str.length){
     1279return str;
     1280}
     1281if(wh>0){
     1282return str.replace(/^\s+/,"");
     1283}else{
     1284if(wh<0){
     1285return str.replace(/\s+$/,"");
     1286}else{
     1287return str.replace(/^\s+|\s+$/g,"");
     1288}
     1289}
     1290};
     1291dojo.string.trimStart=function(str){
     1292return dojo.string.trim(str,1);
     1293};
     1294dojo.string.trimEnd=function(str){
     1295return dojo.string.trim(str,-1);
     1296};
     1297dojo.string.paramString=function(str,_122,_123){
     1298for(var name in _122){
     1299var re=new RegExp("\\%\\{"+name+"\\}","g");
     1300str=str.replace(re,_122[name]);
     1301}
     1302if(_123){
     1303str=str.replace(/%\{([^\}\s]+)\}/g,"");
     1304}
     1305return str;
     1306};
     1307dojo.string.capitalize=function(str){
     1308if(!dojo.lang.isString(str)){
     1309return "";
     1310}
     1311if(arguments.length==0){
     1312str=this;
     1313}
     1314var _127=str.split(" ");
     1315var _128="";
     1316var len=_127.length;
     1317for(var i=0;i<len;i++){
     1318var word=_127[i];
     1319word=word.charAt(0).toUpperCase()+word.substring(1,word.length);
     1320_128+=word;
     1321if(i<len-1){
     1322_128+=" ";
     1323}
     1324}
     1325return new String(_128);
     1326};
     1327dojo.string.isBlank=function(str){
     1328if(!dojo.lang.isString(str)){
     1329return true;
     1330}
     1331return (dojo.string.trim(str).length==0);
     1332};
     1333dojo.string.encodeAscii=function(str){
     1334if(!dojo.lang.isString(str)){
     1335return str;
     1336}
     1337var ret="";
     1338var _12f=escape(str);
     1339var _130,re=/%u([0-9A-F]{4})/i;
     1340while((_130=_12f.match(re))){
     1341var num=Number("0x"+_130[1]);
     1342var _132=escape("&#"+num+";");
     1343ret+=_12f.substring(0,_130.index)+_132;
     1344_12f=_12f.substring(_130.index+_130[0].length);
     1345}
     1346ret+=_12f.replace(/\+/g,"%2B");
     1347return ret;
     1348};
     1349dojo.string.summary=function(str,len){
     1350if(!len||str.length<=len){
     1351return str;
     1352}else{
     1353return str.substring(0,len).replace(/\.+$/,"")+"...";
     1354}
     1355};
     1356dojo.string.escape=function(type,str){
     1357var args=[];
     1358for(var i=1;i<arguments.length;i++){
     1359args.push(arguments[i]);
     1360}
     1361switch(type.toLowerCase()){
     1362case "xml":
     1363case "html":
     1364case "xhtml":
     1365return dojo.string.escapeXml.apply(this,args);
     1366case "sql":
     1367return dojo.string.escapeSql.apply(this,args);
     1368case "regexp":
     1369case "regex":
     1370return dojo.string.escapeRegExp.apply(this,args);
     1371case "javascript":
     1372case "jscript":
     1373case "js":
     1374return dojo.string.escapeJavaScript.apply(this,args);
     1375case "ascii":
     1376return dojo.string.encodeAscii.apply(this,args);
     1377default:
     1378return str;
     1379}
     1380};
     1381dojo.string.escapeXml=function(str,_13a){
     1382str=str.replace(/&/gm,"&amp;").replace(/</gm,"&lt;").replace(/>/gm,"&gt;").replace(/"/gm,"&quot;");
     1383if(!_13a){
     1384str=str.replace(/'/gm,"&#39;");
     1385}
     1386return str;
     1387};
     1388dojo.string.escapeSql=function(str){
     1389return str.replace(/'/gm,"''");
     1390};
     1391dojo.string.escapeRegExp=function(str){
     1392return str.replace(/\\/gm,"\\\\").replace(/([\f\b\n\t\r])/gm,"\\$1");
     1393};
     1394dojo.string.escapeJavaScript=function(str){
     1395return str.replace(/(["'\f\b\n\t\r])/gm,"\\$1");
     1396};
     1397dojo.string.repeat=function(str,_13f,_140){
     1398var out="";
     1399for(var i=0;i<_13f;i++){
     1400out+=str;
     1401if(_140&&i<_13f-1){
     1402out+=_140;
     1403}
     1404}
     1405return out;
     1406};
     1407dojo.string.endsWith=function(str,end,_145){
     1408if(_145){
     1409str=str.toLowerCase();
     1410end=end.toLowerCase();
     1411}
     1412return str.lastIndexOf(end)==str.length-end.length;
     1413};
     1414dojo.string.endsWithAny=function(str){
     1415for(var i=1;i<arguments.length;i++){
     1416if(dojo.string.endsWith(str,arguments[i])){
     1417return true;
     1418}
     1419}
     1420return false;
     1421};
     1422dojo.string.startsWith=function(str,_149,_14a){
     1423if(_14a){
     1424str=str.toLowerCase();
     1425_149=_149.toLowerCase();
     1426}
     1427return str.indexOf(_149)==0;
     1428};
     1429dojo.string.startsWithAny=function(str){
     1430for(var i=1;i<arguments.length;i++){
     1431if(dojo.string.startsWith(str,arguments[i])){
     1432return true;
     1433}
     1434}
     1435return false;
     1436};
     1437dojo.string.has=function(str){
     1438for(var i=1;i<arguments.length;i++){
     1439if(str.indexOf(arguments[i]>-1)){
     1440return true;
     1441}
     1442}
     1443return false;
     1444};
     1445dojo.string.pad=function(str,len,c,dir){
     1446var out=String(str);
     1447if(!c){
     1448c="0";
     1449}
     1450if(!dir){
     1451dir=1;
     1452}
     1453while(out.length<len){
     1454if(dir>0){
     1455out=c+out;
     1456}else{
     1457out+=c;
     1458}
     1459}
     1460return out;
     1461};
     1462dojo.string.padLeft=function(str,len,c){
     1463return dojo.string.pad(str,len,c,1);
     1464};
     1465dojo.string.padRight=function(str,len,c){
     1466return dojo.string.pad(str,len,c,-1);
     1467};
     1468dojo.string.normalizeNewlines=function(text,_15b){
     1469if(_15b=="\n"){
     1470text=text.replace(/\r\n/g,"\n");
     1471text=text.replace(/\r/g,"\n");
     1472}else{
     1473if(_15b=="\r"){
     1474text=text.replace(/\r\n/g,"\r");
     1475text=text.replace(/\n/g,"\r");
     1476}else{
     1477text=text.replace(/([^\r])\n/g,"$1\r\n");
     1478text=text.replace(/\r([^\n])/g,"\r\n$1");
     1479}
     1480}
     1481return text;
     1482};
     1483dojo.string.splitEscaped=function(str,_15d){
     1484var _15e=[];
     1485for(var i=0,prevcomma=0;i<str.length;i++){
     1486if(str.charAt(i)=="\\"){
     1487i++;
     1488continue;
     1489}
     1490if(str.charAt(i)==_15d){
     1491_15e.push(str.substring(prevcomma,i));
     1492prevcomma=i+1;
     1493}
     1494}
     1495_15e.push(str.substr(prevcomma));
     1496return _15e;
     1497};
     1498dojo.string.addToPrototype=function(){
     1499for(var _160 in dojo.string){
     1500if(dojo.lang.isFunction(dojo.string[_160])){
     1501var func=(function(){
     1502var meth=_160;
     1503switch(meth){
     1504case "addToPrototype":
     1505return null;
     1506break;
     1507case "escape":
     1508return function(type){
     1509return dojo.string.escape(type,this);
     1510};
     1511break;
     1512default:
     1513return function(){
     1514var args=[this];
     1515for(var i=0;i<arguments.length;i++){
     1516args.push(arguments[i]);
     1517}
     1518dojo.debug(args);
     1519return dojo.string[meth].apply(dojo.string,args);
     1520};
     1521}
     1522})();
     1523if(func){
     1524String.prototype[_160]=func;
     1525}
     1526}
     1527}
     1528};
     1529dojo.provide("dojo.io.IO");
     1530dojo.require("dojo.string");
     1531dojo.io.transports=[];
     1532dojo.io.hdlrFuncNames=["load","error"];
     1533dojo.io.Request=function(url,_167,_168,_169){
     1534if((arguments.length==1)&&(arguments[0].constructor==Object)){
     1535this.fromKwArgs(arguments[0]);
     1536}else{
     1537this.url=url;
     1538if(_167){
     1539this.mimetype=_167;
     1540}
     1541if(_168){
     1542this.transport=_168;
     1543}
     1544if(arguments.length>=4){
     1545this.changeUrl=_169;
     1546}
     1547}
     1548};
     1549dojo.lang.extend(dojo.io.Request,{url:"",mimetype:"text/plain",method:"GET",content:undefined,transport:undefined,changeUrl:undefined,formNode:undefined,sync:false,bindSuccess:false,useCache:false,preventCache:false,load:function(type,data,evt){
     1550},error:function(type,_16e){
     1551},handle:function(){
     1552},abort:function(){
     1553},fromKwArgs:function(_16f){
     1554if(_16f["url"]){
     1555_16f.url=_16f.url.toString();
     1556}
     1557if(!_16f["method"]&&_16f["formNode"]&&_16f["formNode"].method){
     1558_16f.method=_16f["formNode"].method;
     1559}
     1560if(!_16f["handle"]&&_16f["handler"]){
     1561_16f.handle=_16f.handler;
     1562}
     1563if(!_16f["load"]&&_16f["loaded"]){
     1564_16f.load=_16f.loaded;
     1565}
     1566if(!_16f["changeUrl"]&&_16f["changeURL"]){
     1567_16f.changeUrl=_16f.changeURL;
     1568}
     1569_16f.encoding=dojo.lang.firstValued(_16f["encoding"],djConfig["bindEncoding"],"");
     1570_16f.sendTransport=dojo.lang.firstValued(_16f["sendTransport"],djConfig["ioSendTransport"],true);
     1571var _170=dojo.lang.isFunction;
     1572for(var x=0;x<dojo.io.hdlrFuncNames.length;x++){
     1573var fn=dojo.io.hdlrFuncNames[x];
     1574if(_170(_16f[fn])){
     1575continue;
     1576}
     1577if(_170(_16f["handle"])){
     1578_16f[fn]=_16f.handle;
     1579}
     1580}
     1581dojo.lang.mixin(this,_16f);
     1582}});
     1583dojo.io.Error=function(msg,type,num){
     1584this.message=msg;
     1585this.type=type||"unknown";
     1586this.number=num||0;
     1587};
     1588dojo.io.transports.addTransport=function(name){
     1589this.push(name);
     1590this[name]=dojo.io[name];
     1591};
     1592dojo.io.bind=function(_177){
     1593if(!(_177 instanceof dojo.io.Request)){
     1594try{
     1595_177=new dojo.io.Request(_177);
     1596}
     1597catch(e){
     1598dojo.debug(e);
     1599}
     1600}
     1601var _178="";
     1602if(_177["transport"]){
     1603_178=_177["transport"];
     1604if(!this[_178]){
     1605return _177;
     1606}
     1607}else{
     1608for(var x=0;x<dojo.io.transports.length;x++){
     1609var tmp=dojo.io.transports[x];
     1610if((this[tmp])&&(this[tmp].canHandle(_177))){
     1611_178=tmp;
     1612}
     1613}
     1614if(_178==""){
     1615return _177;
     1616}
     1617}
     1618this[_178].bind(_177);
     1619_177.bindSuccess=true;
     1620return _177;
     1621};
     1622dojo.io.queueBind=function(_17b){
     1623if(!(_17b instanceof dojo.io.Request)){
     1624try{
     1625_17b=new dojo.io.Request(_17b);
     1626}
     1627catch(e){
     1628dojo.debug(e);
     1629}
     1630}
     1631var _17c=_17b.load;
     1632_17b.load=function(){
     1633dojo.io._queueBindInFlight=false;
     1634var ret=_17c.apply(this,arguments);
     1635dojo.io._dispatchNextQueueBind();
     1636return ret;
     1637};
     1638var _17e=_17b.error;
     1639_17b.error=function(){
     1640dojo.io._queueBindInFlight=false;
     1641var ret=_17e.apply(this,arguments);
     1642dojo.io._dispatchNextQueueBind();
     1643return ret;
     1644};
     1645dojo.io._bindQueue.push(_17b);
     1646dojo.io._dispatchNextQueueBind();
     1647return _17b;
     1648};
     1649dojo.io._dispatchNextQueueBind=function(){
     1650if(!dojo.io._queueBindInFlight){
     1651dojo.io._queueBindInFlight=true;
     1652dojo.io.bind(dojo.io._bindQueue.shift());
     1653}
     1654};
     1655dojo.io._bindQueue=[];
     1656dojo.io._queueBindInFlight=false;
     1657dojo.io.argsFromMap=function(map,_181){
     1658var _182=new Object();
     1659var _183="";
     1660var enc=/utf/i.test(_181||"")?encodeURIComponent:dojo.string.encodeAscii;
     1661for(var x in map){
     1662if(!_182[x]){
     1663_183+=enc(x)+"="+enc(map[x])+"&";
     1664}
     1665}
     1666return _183;
     1667};
     1668dojo.provide("dojo.dom");
     1669dojo.require("dojo.lang");
     1670dojo.dom.ELEMENT_NODE=1;
     1671dojo.dom.ATTRIBUTE_NODE=2;
     1672dojo.dom.TEXT_NODE=3;
     1673dojo.dom.CDATA_SECTION_NODE=4;
     1674dojo.dom.ENTITY_REFERENCE_NODE=5;
     1675dojo.dom.ENTITY_NODE=6;
     1676dojo.dom.PROCESSING_INSTRUCTION_NODE=7;
     1677dojo.dom.COMMENT_NODE=8;
     1678dojo.dom.DOCUMENT_NODE=9;
     1679dojo.dom.DOCUMENT_TYPE_NODE=10;
     1680dojo.dom.DOCUMENT_FRAGMENT_NODE=11;
     1681dojo.dom.NOTATION_NODE=12;
     1682dojo.dom.dojoml="http://www.dojotoolkit.org/2004/dojoml";
     1683dojo.dom.xmlns={svg:"http://www.w3.org/2000/svg",smil:"http://www.w3.org/2001/SMIL20/",mml:"http://www.w3.org/1998/Math/MathML",cml:"http://www.xml-cml.org",xlink:"http://www.w3.org/1999/xlink",xhtml:"http://www.w3.org/1999/xhtml",xul:"http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul",xbl:"http://www.mozilla.org/xbl",fo:"http://www.w3.org/1999/XSL/Format",xsl:"http://www.w3.org/1999/XSL/Transform",xslt:"http://www.w3.org/1999/XSL/Transform",xi:"http://www.w3.org/2001/XInclude",xforms:"http://www.w3.org/2002/01/xforms",saxon:"http://icl.com/saxon",xalan:"http://xml.apache.org/xslt",xsd:"http://www.w3.org/2001/XMLSchema",dt:"http://www.w3.org/2001/XMLSchema-datatypes",xsi:"http://www.w3.org/2001/XMLSchema-instance",rdf:"http://www.w3.org/1999/02/22-rdf-syntax-ns#",rdfs:"http://www.w3.org/2000/01/rdf-schema#",dc:"http://purl.org/dc/elements/1.1/",dcq:"http://purl.org/dc/qualifiers/1.0","soap-env":"http://schemas.xmlsoap.org/soap/envelope/",wsdl:"http://schemas.xmlsoap.org/wsdl/",AdobeExtensions:"http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"};
     1684dojo.dom.isNode=dojo.lang.isDomNode=function(wh){
     1685if(typeof Element=="object"){
     1686try{
     1687return wh instanceof Element;
     1688}
     1689catch(E){
     1690}
     1691}else{
     1692return wh&&!isNaN(wh.nodeType);
     1693}
     1694};
     1695dojo.lang.whatAmI.custom["node"]=dojo.dom.isNode;
     1696dojo.dom.getTagName=function(node){
     1697var _188=node.tagName;
     1698if(_188.substr(0,5).toLowerCase()!="dojo:"){
     1699if(_188.substr(0,4).toLowerCase()=="dojo"){
     1700return "dojo:"+_188.substring(4).toLowerCase();
     1701}
     1702var djt=node.getAttribute("dojoType")||node.getAttribute("dojotype");
     1703if(djt){
     1704return "dojo:"+djt.toLowerCase();
     1705}
     1706if((node.getAttributeNS)&&(node.getAttributeNS(this.dojoml,"type"))){
     1707return "dojo:"+node.getAttributeNS(this.dojoml,"type").toLowerCase();
     1708}
     1709try{
     1710djt=node.getAttribute("dojo:type");
     1711}
     1712catch(e){
     1713}
     1714if(djt){
     1715return "dojo:"+djt.toLowerCase();
     1716}
     1717if((!dj_global["djConfig"])||(!djConfig["ignoreClassNames"])){
     1718var _18a=node.className||node.getAttribute("class");
     1719if((_18a)&&(_18a.indexOf)&&(_18a.indexOf("dojo-")!=-1)){
     1720var _18b=_18a.split(" ");
     1721for(var x=0;x<_18b.length;x++){
     1722if((_18b[x].length>5)&&(_18b[x].indexOf("dojo-")>=0)){
     1723return "dojo:"+_18b[x].substr(5).toLowerCase();
     1724}
     1725}
     1726}
     1727}
     1728}
     1729return _188.toLowerCase();
     1730};
     1731dojo.dom.getUniqueId=function(){
     1732do{
     1733var id="dj_unique_"+(++arguments.callee._idIncrement);
     1734}while(document.getElementById(id));
     1735return id;
     1736};
     1737dojo.dom.getUniqueId._idIncrement=0;
     1738dojo.dom.firstElement=dojo.dom.getFirstChildElement=function(_18e,_18f){
     1739var node=_18e.firstChild;
     1740while(node&&node.nodeType!=dojo.dom.ELEMENT_NODE){
     1741node=node.nextSibling;
     1742}
     1743if(_18f&&node&&node.tagName&&node.tagName.toLowerCase()!=_18f.toLowerCase()){
     1744node=dojo.dom.nextElement(node,_18f);
     1745}
     1746return node;
     1747};
     1748dojo.dom.lastElement=dojo.dom.getLastChildElement=function(_191,_192){
     1749var node=_191.lastChild;
     1750while(node&&node.nodeType!=dojo.dom.ELEMENT_NODE){
     1751node=node.previousSibling;
     1752}
     1753if(_192&&node&&node.tagName&&node.tagName.toLowerCase()!=_192.toLowerCase()){
     1754node=dojo.dom.prevElement(node,_192);
     1755}
     1756return node;
     1757};
     1758dojo.dom.nextElement=dojo.dom.getNextSiblingElement=function(node,_195){
     1759if(!node){
     1760return null;
     1761}
     1762do{
     1763node=node.nextSibling;
     1764}while(node&&node.nodeType!=dojo.dom.ELEMENT_NODE);
     1765if(node&&_195&&_195.toLowerCase()!=node.tagName.toLowerCase()){
     1766return dojo.dom.nextElement(node,_195);
     1767}
     1768return node;
     1769};
     1770dojo.dom.prevElement=dojo.dom.getPreviousSiblingElement=function(node,_197){
     1771if(!node){
     1772return null;
     1773}
     1774if(_197){
     1775_197=_197.toLowerCase();
     1776}
     1777do{
     1778node=node.previousSibling;
     1779}while(node&&node.nodeType!=dojo.dom.ELEMENT_NODE);
     1780if(node&&_197&&_197.toLowerCase()!=node.tagName.toLowerCase()){
     1781return dojo.dom.prevElement(node,_197);
     1782}
     1783return node;
     1784};
     1785dojo.dom.moveChildren=function(_198,_199,trim){
     1786var _19b=0;
     1787if(trim){
     1788while(_198.hasChildNodes()&&_198.firstChild.nodeType==dojo.dom.TEXT_NODE){
     1789_198.removeChild(_198.firstChild);
     1790}
     1791while(_198.hasChildNodes()&&_198.lastChild.nodeType==dojo.dom.TEXT_NODE){
     1792_198.removeChild(_198.lastChild);
     1793}
     1794}
     1795while(_198.hasChildNodes()){
     1796_199.appendChild(_198.firstChild);
     1797_19b++;
     1798}
     1799return _19b;
     1800};
     1801dojo.dom.copyChildren=function(_19c,_19d,trim){
     1802var _19f=_19c.cloneNode(true);
     1803return this.moveChildren(_19f,_19d,trim);
     1804};
     1805dojo.dom.removeChildren=function(node){
     1806var _1a1=node.childNodes.length;
     1807while(node.hasChildNodes()){
     1808node.removeChild(node.firstChild);
     1809}
     1810return _1a1;
     1811};
     1812dojo.dom.replaceChildren=function(node,_1a3){
     1813dojo.dom.removeChildren(node);
     1814node.appendChild(_1a3);
     1815};
     1816dojo.dom.removeNode=function(node){
     1817if(node&&node.parentNode){
     1818return node.parentNode.removeChild(node);
     1819}
     1820};
     1821dojo.dom.getAncestors=function(node,_1a6,_1a7){
     1822var _1a8=[];
     1823var _1a9=dojo.lang.isFunction(_1a6);
     1824while(node){
     1825if(!_1a9||_1a6(node)){
     1826_1a8.push(node);
     1827}
     1828if(_1a7&&_1a8.length>0){
     1829return _1a8[0];
     1830}
     1831node=node.parentNode;
     1832}
     1833if(_1a7){
     1834return null;
     1835}
     1836return _1a8;
     1837};
     1838dojo.dom.getAncestorsByTag=function(node,tag,_1ac){
     1839tag=tag.toLowerCase();
     1840return dojo.dom.getAncestors(node,function(el){
     1841return ((el.tagName)&&(el.tagName.toLowerCase()==tag));
     1842},_1ac);
     1843};
     1844dojo.dom.getFirstAncestorByTag=function(node,tag){
     1845return dojo.dom.getAncestorsByTag(node,tag,true);
     1846};
     1847dojo.dom.isDescendantOf=function(node,_1b1,_1b2){
     1848if(_1b2&&node){
     1849node=node.parentNode;
     1850}
     1851while(node){
     1852if(node==_1b1){
     1853return true;
     1854}
     1855node=node.parentNode;
     1856}
     1857return false;
     1858};
     1859dojo.dom.innerXML=function(node){
     1860if(node.innerXML){
     1861return node.innerXML;
     1862}else{
     1863if(typeof XMLSerializer!="undefined"){
     1864return (new XMLSerializer()).serializeToString(node);
     1865}
     1866}
     1867};
     1868dojo.dom.createDocumentFromText=function(str,_1b5){
     1869if(!_1b5){
     1870_1b5="text/xml";
     1871}
     1872if(typeof DOMParser!="undefined"){
     1873var _1b6=new DOMParser();
     1874return _1b6.parseFromString(str,_1b5);
     1875}else{
     1876if(typeof ActiveXObject!="undefined"){
     1877var _1b7=new ActiveXObject("Microsoft.XMLDOM");
     1878if(_1b7){
     1879_1b7.async=false;
     1880_1b7.loadXML(str);
     1881return _1b7;
     1882}else{
     1883dojo.debug("toXml didn't work?");
     1884}
     1885}else{
     1886if(document.createElement){
     1887var tmp=document.createElement("xml");
     1888tmp.innerHTML=str;
     1889if(document.implementation&&document.implementation.createDocument){
     1890var _1b9=document.implementation.createDocument("foo","",null);
     1891for(var i=0;i<tmp.childNodes.length;i++){
     1892_1b9.importNode(tmp.childNodes.item(i),true);
     1893}
     1894return _1b9;
     1895}
     1896return tmp.document&&tmp.document.firstChild?tmp.document.firstChild:tmp;
     1897}
     1898}
     1899}
     1900return null;
     1901};
     1902dojo.dom.prependChild=function(node,_1bc){
     1903if(_1bc.firstChild){
     1904_1bc.insertBefore(node,_1bc.firstChild);
     1905}else{
     1906_1bc.appendChild(node);
     1907}
     1908return true;
     1909};
     1910dojo.dom.insertBefore=function(node,ref,_1bf){
     1911if(_1bf!=true&&(node===ref||node.nextSibling===ref)){
     1912return false;
     1913}
     1914var _1c0=ref.parentNode;
     1915_1c0.insertBefore(node,ref);
     1916return true;
     1917};
     1918dojo.dom.insertAfter=function(node,ref,_1c3){
     1919var pn=ref.parentNode;
     1920if(ref==pn.lastChild){
     1921if((_1c3!=true)&&(node===ref)){
     1922return false;
     1923}
     1924pn.appendChild(node);
     1925}else{
     1926return this.insertBefore(node,ref.nextSibling,_1c3);
     1927}
     1928return true;
     1929};
     1930dojo.dom.insertAtPosition=function(node,ref,_1c7){
     1931if((!node)||(!ref)||(!_1c7)){
     1932return false;
     1933}
     1934switch(_1c7.toLowerCase()){
     1935case "before":
     1936return dojo.dom.insertBefore(node,ref);
     1937case "after":
     1938return dojo.dom.insertAfter(node,ref);
     1939case "first":
     1940if(ref.firstChild){
     1941return dojo.dom.insertBefore(node,ref.firstChild);
     1942}else{
     1943ref.appendChild(node);
     1944return true;
     1945}
     1946break;
     1947default:
     1948ref.appendChild(node);
     1949return true;
     1950}
     1951};
     1952dojo.dom.insertAtIndex=function(node,_1c9,_1ca){
     1953var _1cb=_1c9.childNodes;
     1954if(!_1cb.length){
     1955_1c9.appendChild(node);
     1956return true;
     1957}
     1958var _1cc=null;
     1959for(var i=0;i<_1cb.length;i++){
     1960var _1ce=_1cb.item(i)["getAttribute"]?parseInt(_1cb.item(i).getAttribute("dojoinsertionindex")):-1;
     1961if(_1ce<_1ca){
     1962_1cc=_1cb.item(i);
     1963}
     1964}
     1965if(_1cc){
     1966return dojo.dom.insertAfter(node,_1cc);
     1967}else{
     1968return dojo.dom.insertBefore(node,_1cb.item(0));
     1969}
     1970};
     1971dojo.dom.textContent=function(node,text){
     1972if(text){
     1973dojo.dom.replaceChildren(node,document.createTextNode(text));
     1974return text;
     1975}else{
     1976var _1d1="";
     1977if(node==null){
     1978return _1d1;
     1979}
     1980for(var i=0;i<node.childNodes.length;i++){
     1981switch(node.childNodes[i].nodeType){
     1982case 1:
     1983case 5:
     1984_1d1+=dojo.dom.textContent(node.childNodes[i]);
     1985break;
     1986case 3:
     1987case 2:
     1988case 4:
     1989_1d1+=node.childNodes[i].nodeValue;
     1990break;
     1991default:
     1992break;
     1993}
     1994}
     1995return _1d1;
     1996}
     1997};
     1998dojo.dom.collectionToArray=function(_1d3){
     1999dojo.deprecated("dojo.dom.collectionToArray","use dojo.lang.toArray instead");
     2000return dojo.lang.toArray(_1d3);
     2001};
     2002dojo.dom.hasParent=function(node){
     2003if(!node||!node.parentNode||(node.parentNode&&!node.parentNode.tagName)){
     2004return false;
     2005}
     2006return true;
     2007};
     2008dojo.dom.isTag=function(node){
     2009if(node&&node.tagName){
     2010var arr=dojo.lang.toArray(arguments,1);
     2011return arr[dojo.lang.find(node.tagName,arr)]||"";
     2012}
     2013return "";
     2014};
     2015dojo.provide("dojo.io.BrowserIO");
     2016dojo.require("dojo.io");
     2017dojo.require("dojo.lang");
     2018dojo.require("dojo.dom");
     2019try{
     2020if((!djConfig["preventBackButtonFix"])&&(!dojo.hostenv.post_load_)){
     2021document.write("<iframe style='border: 0px; width: 1px; height: 1px; position: absolute; bottom: 0px; right: 0px; visibility: visible;' name='djhistory' id='djhistory' src='"+(dojo.hostenv.getBaseScriptUri()+"iframe_history.html")+"'></iframe>");
     2022}
     2023}
     2024catch(e){
     2025}
     2026dojo.io.checkChildrenForFile=function(node){
     2027var _1d8=false;
     2028var _1d9=node.getElementsByTagName("input");
     2029dojo.lang.forEach(_1d9,function(_1da){
     2030if(_1d8){
     2031return;
     2032}
     2033if(_1da.getAttribute("type")=="file"){
     2034_1d8=true;
     2035}
     2036});
     2037return _1d8;
     2038};
     2039dojo.io.formHasFile=function(_1db){
     2040return dojo.io.checkChildrenForFile(_1db);
     2041};
     2042dojo.io.encodeForm=function(_1dc,_1dd){
     2043if((!_1dc)||(!_1dc.tagName)||(!_1dc.tagName.toLowerCase()=="form")){
     2044dojo.raise("Attempted to encode a non-form element.");
     2045}
     2046var enc=/utf/i.test(_1dd||"")?encodeURIComponent:dojo.string.encodeAscii;
     2047var _1df=[];
     2048for(var i=0;i<_1dc.elements.length;i++){
     2049var elm=_1dc.elements[i];
     2050if(elm.disabled||elm.tagName.toLowerCase()=="fieldset"||!elm.name){
     2051continue;
     2052}
     2053var name=enc(elm.name);
     2054var type=elm.type.toLowerCase();
     2055if(type=="select-multiple"){
     2056for(var j=0;j<elm.options.length;j++){
     2057if(elm.options[j].selected){
     2058_1df.push(name+"="+enc(elm.options[j].value));
     2059}
     2060}
     2061}else{
     2062if(dojo.lang.inArray(type,["radio","checkbox"])){
     2063if(elm.checked){
     2064_1df.push(name+"="+enc(elm.value));
     2065}
     2066}else{
     2067if(!dojo.lang.inArray(type,["file","submit","reset","button"])){
     2068_1df.push(name+"="+enc(elm.value));
     2069}
     2070}
     2071}
     2072}
     2073var _1e5=_1dc.getElementsByTagName("input");
     2074for(var i=0;i<_1e5.length;i++){
     2075var _1e6=_1e5[i];
     2076if(_1e6.type.toLowerCase()=="image"&&_1e6.form==_1dc){
     2077var name=enc(_1e6.name);
     2078_1df.push(name+"="+enc(_1e6.value));
     2079_1df.push(name+".x=0");
     2080_1df.push(name+".y=0");
     2081}
     2082}
     2083return _1df.join("&")+"&";
     2084};
     2085dojo.io.setIFrameSrc=function(_1e7,src,_1e9){
     2086try{
     2087var r=dojo.render.html;
     2088if(!_1e9){
     2089if(r.safari){
     2090_1e7.location=src;
     2091}else{
     2092frames[_1e7.name].location=src;
     2093}
     2094}else{
     2095var idoc;
     2096if(r.ie){
     2097idoc=_1e7.contentWindow.document;
     2098}else{
     2099if(r.moz){
     2100idoc=_1e7.contentWindow;
     2101}else{
     2102if(r.safari){
     2103idoc=_1e7.document;
     2104}
     2105}
     2106}
     2107idoc.location.replace(src);
     2108}
     2109}
     2110catch(e){
     2111dojo.debug(e);
     2112dojo.debug("setIFrameSrc: "+e);
     2113}
     2114};
     2115dojo.io.XMLHTTPTransport=new function(){
     2116var _1ec=this;
     2117this.initialHref=window.location.href;
     2118this.initialHash=window.location.hash;
     2119this.moveForward=false;
     2120var _1ed={};
     2121this.useCache=false;
     2122this.preventCache=false;
     2123this.historyStack=[];
     2124this.forwardStack=[];
     2125this.historyIframe=null;
     2126this.bookmarkAnchor=null;
     2127this.locationTimer=null;
     2128function getCacheKey(url,_1ef,_1f0){
     2129return url+"|"+_1ef+"|"+_1f0.toLowerCase();
     2130}
     2131function addToCache(url,_1f2,_1f3,http){
     2132_1ed[getCacheKey(url,_1f2,_1f3)]=http;
     2133}
     2134function getFromCache(url,_1f6,_1f7){
     2135return _1ed[getCacheKey(url,_1f6,_1f7)];
     2136}
     2137this.clearCache=function(){
     2138_1ed={};
     2139};
     2140function doLoad(_1f8,http,url,_1fb,_1fc){
     2141if((http.status==200)||(location.protocol=="file:"&&http.status==0)){
     2142var ret;
     2143if(_1f8.method.toLowerCase()=="head"){
     2144var _1fe=http.getAllResponseHeaders();
     2145ret={};
     2146ret.toString=function(){
     2147return _1fe;
     2148};
     2149var _1ff=_1fe.split(/[\r\n]+/g);
     2150for(var i=0;i<_1ff.length;i++){
     2151var pair=_1ff[i].match(/^([^:]+)\s*:\s*(.+)$/i);
     2152if(pair){
     2153ret[pair[1]]=pair[2];
     2154}
     2155}
     2156}else{
     2157if(_1f8.mimetype=="text/javascript"){
     2158try{
     2159ret=dj_eval(http.responseText);
     2160}
     2161catch(e){
     2162dojo.debug(e);
     2163dojo.debug(http.responseText);
     2164ret=null;
     2165}
     2166}else{
     2167if(_1f8.mimetype=="text/json"){
     2168try{
     2169ret=dj_eval("("+http.responseText+")");
     2170}
     2171catch(e){
     2172dojo.debug(e);
     2173dojo.debug(http.responseText);
     2174ret=false;
     2175}
     2176}else{
     2177if((_1f8.mimetype=="application/xml")||(_1f8.mimetype=="text/xml")){
     2178ret=http.responseXML;
     2179if(!ret||typeof ret=="string"){
     2180ret=dojo.dom.createDocumentFromText(http.responseText);
     2181}
     2182}else{
     2183ret=http.responseText;
     2184}
     2185}
     2186}
     2187}
     2188if(_1fc){
     2189addToCache(url,_1fb,_1f8.method,http);
     2190}
     2191_1f8[(typeof _1f8.load=="function")?"load":"handle"]("load",ret,http);
     2192}else{
     2193var _202=new dojo.io.Error("XMLHttpTransport Error: "+http.status+" "+http.statusText);
     2194_1f8[(typeof _1f8.error=="function")?"error":"handle"]("error",_202,http);
     2195}
     2196}
     2197function setHeaders(http,_204){
     2198if(_204["headers"]){
     2199for(var _205 in _204["headers"]){
     2200if(_205.toLowerCase()=="content-type"&&!_204["contentType"]){
     2201_204["contentType"]=_204["headers"][_205];
     2202}else{
     2203http.setRequestHeader(_205,_204["headers"][_205]);
     2204}
     2205}
     2206}
     2207}
     2208this.addToHistory=function(args){
     2209var _207=args["back"]||args["backButton"]||args["handle"];
     2210var hash=null;
     2211if(!this.historyIframe){
     2212this.historyIframe=window.frames["djhistory"];
     2213}
     2214if(!this.bookmarkAnchor){
     2215this.bookmarkAnchor=document.createElement("a");
     2216(document.body||document.getElementsByTagName("body")[0]).appendChild(this.bookmarkAnchor);
     2217this.bookmarkAnchor.style.display="none";
     2218}
     2219if((!args["changeUrl"])||(dojo.render.html.ie)){
     2220var url=dojo.hostenv.getBaseScriptUri()+"iframe_history.html?"+(new Date()).getTime();
     2221this.moveForward=true;
     2222dojo.io.setIFrameSrc(this.historyIframe,url,false);
     2223}
     2224if(args["changeUrl"]){
     2225hash="#"+((args["changeUrl"]!==true)?args["changeUrl"]:(new Date()).getTime());
     2226setTimeout("window.location.href = '"+hash+"';",1);
     2227this.bookmarkAnchor.href=hash;
     2228if(dojo.render.html.ie){
     2229var _20a=_207;
     2230var lh=null;
     2231var hsl=this.historyStack.length-1;
     2232if(hsl>=0){
     2233while(!this.historyStack[hsl]["urlHash"]){
     2234hsl--;
     2235}
     2236lh=this.historyStack[hsl]["urlHash"];
     2237}
     2238if(lh){
     2239_207=function(){
     2240if(window.location.hash!=""){
     2241setTimeout("window.location.href = '"+lh+"';",1);
     2242}
     2243_20a();
     2244};
     2245}
     2246this.forwardStack=[];
     2247var _20d=args["forward"]||args["forwardButton"];
     2248var tfw=function(){
     2249if(window.location.hash!=""){
     2250window.location.href=hash;
     2251}
     2252if(_20d){
     2253_20d();
     2254}
     2255};
     2256if(args["forward"]){
     2257args.forward=tfw;
     2258}else{
     2259if(args["forwardButton"]){
     2260args.forwardButton=tfw;
     2261}
     2262}
     2263}else{
     2264if(dojo.render.html.moz){
     2265if(!this.locationTimer){
     2266this.locationTimer=setInterval("dojo.io.XMLHTTPTransport.checkLocation();",200);
     2267}
     2268}
     2269}
     2270}
     2271this.historyStack.push({"url":url,"callback":_207,"kwArgs":args,"urlHash":hash});
     2272};
     2273this.checkLocation=function(){
     2274var hsl=this.historyStack.length;
     2275if((window.location.hash==this.initialHash)||(window.location.href==this.initialHref)&&(hsl==1)){
     2276this.handleBackButton();
     2277return;
     2278}
     2279if(this.forwardStack.length>0){
     2280if(this.forwardStack[this.forwardStack.length-1].urlHash==window.location.hash){
     2281this.handleForwardButton();
     2282return;
     2283}
     2284}
     2285if((hsl>=2)&&(this.historyStack[hsl-2])){
     2286if(this.historyStack[hsl-2].urlHash==window.location.hash){
     2287this.handleBackButton();
     2288return;
     2289}
     2290}
     2291};
     2292this.iframeLoaded=function(evt,_211){
     2293var isp=_211.href.split("?");
     2294if(isp.length<2){
     2295if(this.historyStack.length==1){
     2296this.handleBackButton();
     2297}
     2298return;
     2299}
     2300var _213=isp[1];
     2301if(this.moveForward){
     2302this.moveForward=false;
     2303return;
     2304}
     2305var last=this.historyStack.pop();
     2306if(!last){
     2307if(this.forwardStack.length>0){
     2308var next=this.forwardStack[this.forwardStack.length-1];
     2309if(_213==next.url.split("?")[1]){
     2310this.handleForwardButton();
     2311}
     2312}
     2313return;
     2314}
     2315this.historyStack.push(last);
     2316if(this.historyStack.length>=2){
     2317if(isp[1]==this.historyStack[this.historyStack.length-2].url.split("?")[1]){
     2318this.handleBackButton();
     2319}
     2320}else{
     2321this.handleBackButton();
     2322}
     2323};
     2324this.handleBackButton=function(){
     2325var last=this.historyStack.pop();
     2326if(!last){
     2327return;
     2328}
     2329if(last["callback"]){
     2330last.callback();
     2331}else{
     2332if(last.kwArgs["backButton"]){
     2333last.kwArgs["backButton"]();
     2334}else{
     2335if(last.kwArgs["back"]){
     2336last.kwArgs["back"]();
     2337}else{
     2338if(last.kwArgs["handle"]){
     2339last.kwArgs.handle("back");
     2340}
     2341}
     2342}
     2343}
     2344this.forwardStack.push(last);
     2345};
     2346this.handleForwardButton=function(){
     2347var last=this.forwardStack.pop();
     2348if(!last){
     2349return;
     2350}
     2351if(last.kwArgs["forward"]){
     2352last.kwArgs.forward();
     2353}else{
     2354if(last.kwArgs["forwardButton"]){
     2355last.kwArgs.forwardButton();
     2356}else{
     2357if(last.kwArgs["handle"]){
     2358last.kwArgs.handle("forward");
     2359}
     2360}
     2361}
     2362this.historyStack.push(last);
     2363};
     2364this.inFlight=[];
     2365this.inFlightTimer=null;
     2366this.startWatchingInFlight=function(){
     2367if(!this.inFlightTimer){
     2368this.inFlightTimer=setInterval("dojo.io.XMLHTTPTransport.watchInFlight();",10);
     2369}
     2370};
     2371this.watchInFlight=function(){
     2372for(var x=this.inFlight.length-1;x>=0;x--){
     2373var tif=this.inFlight[x];
     2374if(!tif){
     2375this.inFlight.splice(x,1);
     2376continue;
     2377}
     2378if(4==tif.http.readyState){
     2379this.inFlight.splice(x,1);
     2380doLoad(tif.req,tif.http,tif.url,tif.query,tif.useCache);
     2381if(this.inFlight.length==0){
     2382clearInterval(this.inFlightTimer);
     2383this.inFlightTimer=null;
     2384}
     2385}
     2386}
     2387};
     2388var _21a=dojo.hostenv.getXmlhttpObject()?true:false;
     2389this.canHandle=function(_21b){
     2390return _21a&&dojo.lang.inArray((_21b["mimetype"]||"".toLowerCase()),["text/plain","text/html","application/xml","text/xml","text/javascript","text/json"])&&dojo.lang.inArray(_21b["method"].toLowerCase(),["post","get","head"])&&!(_21b["formNode"]&&dojo.io.formHasFile(_21b["formNode"]));
     2391};
     2392this.multipartBoundary="45309FFF-BD65-4d50-99C9-36986896A96F";
     2393this.bind=function(_21c){
     2394if(!_21c["url"]){
     2395if(!_21c["formNode"]&&(_21c["backButton"]||_21c["back"]||_21c["changeUrl"]||_21c["watchForURL"])&&(!djConfig.preventBackButtonFix)){
     2396this.addToHistory(_21c);
     2397return true;
     2398}
     2399}
     2400var url=_21c.url;
     2401var _21e="";
     2402if(_21c["formNode"]){
     2403var ta=_21c.formNode.getAttribute("action");
     2404if((ta)&&(!_21c["url"])){
     2405url=ta;
     2406}
     2407var tp=_21c.formNode.getAttribute("method");
     2408if((tp)&&(!_21c["method"])){
     2409_21c.method=tp;
     2410}
     2411_21e+=dojo.io.encodeForm(_21c.formNode,_21c.encoding);
     2412}
     2413if(url.indexOf("#")>-1){
     2414dojo.debug("Warning: dojo.io.bind: stripping hash values from url:",url);
     2415url=url.split("#")[0];
     2416}
     2417if(_21c["file"]){
     2418_21c.method="post";
     2419}
     2420if(!_21c["method"]){
     2421_21c.method="get";
     2422}
     2423if(_21c.method.toLowerCase()=="get"){
     2424_21c.multipart=false;
     2425}else{
     2426if(_21c["file"]){
     2427_21c.multipart=true;
     2428}else{
     2429if(!_21c["multipart"]){
     2430_21c.multipart=false;
     2431}
     2432}
     2433}
     2434if(_21c["backButton"]||_21c["back"]||_21c["changeUrl"]){
     2435this.addToHistory(_21c);
     2436}
     2437var _221=_21c["content"]||{};
     2438if(_21c.sendTransport){
     2439_221["dojo.transport"]="xmlhttp";
     2440}
     2441do{
     2442if(_21c.postContent){
     2443_21e=_21c.postContent;
     2444break;
     2445}
     2446if(_221){
     2447_21e+=dojo.io.argsFromMap(_221,_21c.encoding);
     2448}
     2449if(_21c.method.toLowerCase()=="get"||!_21c.multipart){
     2450break;
     2451}
     2452var t=[];
     2453if(_21e.length){
     2454var q=_21e.split("&");
     2455for(var i=0;i<q.length;++i){
     2456if(q[i].length){
     2457var p=q[i].split("=");
     2458t.push("--"+this.multipartBoundary,"Content-Disposition: form-data; name=\""+p[0]+"\"","",p[1]);
     2459}
     2460}
     2461}
     2462if(_21c.file){
     2463if(dojo.lang.isArray(_21c.file)){
     2464for(var i=0;i<_21c.file.length;++i){
     2465var o=_21c.file[i];
     2466t.push("--"+this.multipartBoundary,"Content-Disposition: form-data; name=\""+o.name+"\"; filename=\""+("fileName" in o?o.fileName:o.name)+"\"","Content-Type: "+("contentType" in o?o.contentType:"application/octet-stream"),"",o.content);
     2467}
     2468}else{
     2469var o=_21c.file;
     2470t.push("--"+this.multipartBoundary,"Content-Disposition: form-data; name=\""+o.name+"\"; filename=\""+("fileName" in o?o.fileName:o.name)+"\"","Content-Type: "+("contentType" in o?o.contentType:"application/octet-stream"),"",o.content);
     2471}
     2472}
     2473if(t.length){
     2474t.push("--"+this.multipartBoundary+"--","");
     2475_21e=t.join("\r\n");
     2476}
     2477}while(false);
     2478var _227=_21c["sync"]?false:true;
     2479var _228=_21c["preventCache"]||(this.preventCache==true&&_21c["preventCache"]!=false);
     2480var _229=_21c["useCache"]==true||(this.useCache==true&&_21c["useCache"]!=false);
     2481if(!_228&&_229){
     2482var _22a=getFromCache(url,_21e,_21c.method);
     2483if(_22a){
     2484doLoad(_21c,_22a,url,_21e,false);
     2485return;
     2486}
     2487}
     2488var http=dojo.hostenv.getXmlhttpObject();
     2489var _22c=false;
     2490if(_227){
     2491this.inFlight.push({"req":_21c,"http":http,"url":url,"query":_21e,"useCache":_229});
     2492this.startWatchingInFlight();
     2493}
     2494if(_21c.method.toLowerCase()=="post"){
     2495http.open("POST",url,_227);
     2496setHeaders(http,_21c);
     2497http.setRequestHeader("Content-Type",_21c.multipart?("multipart/form-data; boundary="+this.multipartBoundary):(_21c.contentType||"application/x-www-form-urlencoded"));
     2498http.send(_21e);
     2499}else{
     2500var _22d=url;
     2501if(_21e!=""){
     2502_22d+=(_22d.indexOf("?")>-1?"&":"?")+_21e;
     2503}
     2504if(_228){
     2505_22d+=(dojo.string.endsWithAny(_22d,"?","&")?"":(_22d.indexOf("?")>-1?"&":"?"))+"dojo.preventCache="+new Date().valueOf();
     2506}
     2507http.open(_21c.method.toUpperCase(),_22d,_227);
     2508setHeaders(http,_21c);
     2509http.send(null);
     2510}
     2511if(!_227){
     2512doLoad(_21c,http,url,_21e,_229);
     2513}
     2514_21c.abort=function(){
     2515return http.abort();
     2516};
     2517return;
     2518};
     2519dojo.io.transports.addTransport("XMLHTTPTransport");
     2520};
     2521dojo.require("dojo.lang");
     2522dojo.provide("dojo.event");
     2523dojo.event=new function(){
     2524this.canTimeout=dojo.lang.isFunction(dj_global["setTimeout"])||dojo.lang.isAlien(dj_global["setTimeout"]);
     2525function interpolateArgs(args){
     2526var dl=dojo.lang;
     2527var ao={srcObj:dj_global,srcFunc:null,adviceObj:dj_global,adviceFunc:null,aroundObj:null,aroundFunc:null,adviceType:(args.length>2)?args[0]:"after",precedence:"last",once:false,delay:null,rate:0,adviceMsg:false};
     2528switch(args.length){
     2529case 0:
     2530return;
     2531case 1:
     2532return;
     2533case 2:
     2534ao.srcFunc=args[0];
     2535ao.adviceFunc=args[1];
     2536break;
     2537case 3:
     2538if((dl.isObject(args[0]))&&(dl.isString(args[1]))&&(dl.isString(args[2]))){
     2539ao.adviceType="after";
     2540ao.srcObj=args[0];
     2541ao.srcFunc=args[1];
     2542ao.adviceFunc=args[2];
     2543}else{
     2544if((dl.isString(args[1]))&&(dl.isString(args[2]))){
     2545ao.srcFunc=args[1];
     2546ao.adviceFunc=args[2];
     2547}else{
     2548if((dl.isObject(args[0]))&&(dl.isString(args[1]))&&(dl.isFunction(args[2]))){
     2549ao.adviceType="after";
     2550ao.srcObj=args[0];
     2551ao.srcFunc=args[1];
     2552var _231=dojo.lang.nameAnonFunc(args[2],ao.adviceObj);
     2553ao.adviceFunc=_231;
     2554}else{
     2555if((dl.isFunction(args[0]))&&(dl.isObject(args[1]))&&(dl.isString(args[2]))){
     2556ao.adviceType="after";
     2557ao.srcObj=dj_global;
     2558var _231=dojo.lang.nameAnonFunc(args[0],ao.srcObj);
     2559ao.srcFunc=_231;
     2560ao.adviceObj=args[1];
     2561ao.adviceFunc=args[2];
     2562}
     2563}
     2564}
     2565}
     2566break;
     2567case 4:
     2568if((dl.isObject(args[0]))&&(dl.isObject(args[2]))){
     2569ao.adviceType="after";
     2570ao.srcObj=args[0];
     2571ao.srcFunc=args[1];
     2572ao.adviceObj=args[2];
     2573ao.adviceFunc=args[3];
     2574}else{
     2575if((dl.isString(args[0]))&&(dl.isString(args[1]))&&(dl.isObject(args[2]))){
     2576ao.adviceType=args[0];
     2577ao.srcObj=dj_global;
     2578ao.srcFunc=args[1];
     2579ao.adviceObj=args[2];
     2580ao.adviceFunc=args[3];
     2581}else{
     2582if((dl.isString(args[0]))&&(dl.isFunction(args[1]))&&(dl.isObject(args[2]))){
     2583ao.adviceType=args[0];
     2584ao.srcObj=dj_global;
     2585var _231=dojo.lang.nameAnonFunc(args[1],dj_global);
     2586ao.srcFunc=_231;
     2587ao.adviceObj=args[2];
     2588ao.adviceFunc=args[3];
     2589}else{
     2590if(dl.isObject(args[1])){
     2591ao.srcObj=args[1];
     2592ao.srcFunc=args[2];
     2593ao.adviceObj=dj_global;
     2594ao.adviceFunc=args[3];
     2595}else{
     2596if(dl.isObject(args[2])){
     2597ao.srcObj=dj_global;
     2598ao.srcFunc=args[1];
     2599ao.adviceObj=args[2];
     2600ao.adviceFunc=args[3];
     2601}else{
     2602ao.srcObj=ao.adviceObj=ao.aroundObj=dj_global;
     2603ao.srcFunc=args[1];
     2604ao.adviceFunc=args[2];
     2605ao.aroundFunc=args[3];
     2606}
     2607}
     2608}
     2609}
     2610}
     2611break;
     2612case 6:
     2613ao.srcObj=args[1];
     2614ao.srcFunc=args[2];
     2615ao.adviceObj=args[3];
     2616ao.adviceFunc=args[4];
     2617ao.aroundFunc=args[5];
     2618ao.aroundObj=dj_global;
     2619break;
     2620default:
     2621ao.srcObj=args[1];
     2622ao.srcFunc=args[2];
     2623ao.adviceObj=args[3];
     2624ao.adviceFunc=args[4];
     2625ao.aroundObj=args[5];
     2626ao.aroundFunc=args[6];
     2627ao.once=args[7];
     2628ao.delay=args[8];
     2629ao.rate=args[9];
     2630ao.adviceMsg=args[10];
     2631break;
     2632}
     2633if((typeof ao.srcFunc).toLowerCase()!="string"){
     2634ao.srcFunc=dojo.lang.getNameInObj(ao.srcObj,ao.srcFunc);
     2635}
     2636if((typeof ao.adviceFunc).toLowerCase()!="string"){
     2637ao.adviceFunc=dojo.lang.getNameInObj(ao.adviceObj,ao.adviceFunc);
     2638}
     2639if((ao.aroundObj)&&((typeof ao.aroundFunc).toLowerCase()!="string")){
     2640ao.aroundFunc=dojo.lang.getNameInObj(ao.aroundObj,ao.aroundFunc);
     2641}
     2642if(!ao.srcObj){
     2643dojo.raise("bad srcObj for srcFunc: "+ao.srcFunc);
     2644}
     2645if(!ao.adviceObj){
     2646dojo.raise("bad adviceObj for adviceFunc: "+ao.adviceFunc);
     2647}
     2648return ao;
     2649}
     2650this.connect=function(){
     2651var ao=interpolateArgs(arguments);
     2652var mjp=dojo.event.MethodJoinPoint.getForMethod(ao.srcObj,ao.srcFunc);
     2653if(ao.adviceFunc){
     2654var mjp2=dojo.event.MethodJoinPoint.getForMethod(ao.adviceObj,ao.adviceFunc);
     2655}
     2656mjp.kwAddAdvice(ao);
     2657return mjp;
     2658};
     2659this.connectBefore=function(){
     2660var args=["before"];
     2661for(var i=0;i<arguments.length;i++){
     2662args.push(arguments[i]);
     2663}
     2664return this.connect.apply(this,args);
     2665};
     2666this.connectAround=function(){
     2667var args=["around"];
     2668for(var i=0;i<arguments.length;i++){
     2669args.push(arguments[i]);
     2670}
     2671return this.connect.apply(this,args);
     2672};
     2673this._kwConnectImpl=function(_239,_23a){
     2674var fn=(_23a)?"disconnect":"connect";
     2675if(typeof _239["srcFunc"]=="function"){
     2676_239.srcObj=_239["srcObj"]||dj_global;
     2677var _23c=dojo.lang.nameAnonFunc(_239.srcFunc,_239.srcObj);
     2678_239.srcFunc=_23c;
     2679}
     2680if(typeof _239["adviceFunc"]=="function"){
     2681_239.adviceObj=_239["adviceObj"]||dj_global;
     2682var _23c=dojo.lang.nameAnonFunc(_239.adviceFunc,_239.adviceObj);
     2683_239.adviceFunc=_23c;
     2684}
     2685return dojo.event[fn]((_239["type"]||_239["adviceType"]||"after"),_239["srcObj"]||dj_global,_239["srcFunc"],_239["adviceObj"]||_239["targetObj"]||dj_global,_239["adviceFunc"]||_239["targetFunc"],_239["aroundObj"],_239["aroundFunc"],_239["once"],_239["delay"],_239["rate"],_239["adviceMsg"]||false);
     2686};
     2687this.kwConnect=function(_23d){
     2688return this._kwConnectImpl(_23d,false);
     2689};
     2690this.disconnect=function(){
     2691var ao=interpolateArgs(arguments);
     2692if(!ao.adviceFunc){
     2693return;
     2694}
     2695var mjp=dojo.event.MethodJoinPoint.getForMethod(ao.srcObj,ao.srcFunc);
     2696return mjp.removeAdvice(ao.adviceObj,ao.adviceFunc,ao.adviceType,ao.once);
     2697};
     2698this.kwDisconnect=function(_240){
     2699return this._kwConnectImpl(_240,true);
     2700};
     2701};
     2702dojo.event.MethodInvocation=function(_241,obj,args){
     2703this.jp_=_241;
     2704this.object=obj;
     2705this.args=[];
     2706for(var x=0;x<args.length;x++){
     2707this.args[x]=args[x];
     2708}
     2709this.around_index=-1;
     2710};
     2711dojo.event.MethodInvocation.prototype.proceed=function(){
     2712this.around_index++;
     2713if(this.around_index>=this.jp_.around.length){
     2714return this.jp_.object[this.jp_.methodname].apply(this.jp_.object,this.args);
     2715}else{
     2716var ti=this.jp_.around[this.around_index];
     2717var mobj=ti[0]||dj_global;
     2718var meth=ti[1];
     2719return mobj[meth].call(mobj,this);
     2720}
     2721};
     2722dojo.event.MethodJoinPoint=function(obj,_249){
     2723this.object=obj||dj_global;
     2724this.methodname=_249;
     2725this.methodfunc=this.object[_249];
     2726this.before=[];
     2727this.after=[];
     2728this.around=[];
     2729};
     2730dojo.event.MethodJoinPoint.getForMethod=function(obj,_24b){
     2731if(!obj){
     2732obj=dj_global;
     2733}
     2734if(!obj[_24b]){
     2735obj[_24b]=function(){
     2736};
     2737}else{
     2738if((!dojo.lang.isFunction(obj[_24b]))&&(!dojo.lang.isAlien(obj[_24b]))){
     2739return null;
     2740}
     2741}
     2742var _24c=_24b+"$joinpoint";
     2743var _24d=_24b+"$joinpoint$method";
     2744var _24e=obj[_24c];
     2745if(!_24e){
     2746var _24f=false;
     2747if(dojo.event["browser"]){
     2748if((obj["attachEvent"])||(obj["nodeType"])||(obj["addEventListener"])){
     2749_24f=true;
     2750dojo.event.browser.addClobberNodeAttrs(obj,[_24c,_24d,_24b]);
     2751}
     2752}
     2753obj[_24d]=obj[_24b];
     2754_24e=obj[_24c]=new dojo.event.MethodJoinPoint(obj,_24d);
     2755obj[_24b]=function(){
     2756var args=[];
     2757if((_24f)&&(!arguments.length)&&(window.event)){
     2758args.push(dojo.event.browser.fixEvent(window.event));
     2759}else{
     2760for(var x=0;x<arguments.length;x++){
     2761if((x==0)&&(_24f)&&(dojo.event.browser.isEvent(arguments[x]))){
     2762args.push(dojo.event.browser.fixEvent(arguments[x]));
     2763}else{
     2764args.push(arguments[x]);
     2765}
     2766}
     2767}
     2768return _24e.run.apply(_24e,args);
     2769};
     2770}
     2771return _24e;
     2772};
     2773dojo.lang.extend(dojo.event.MethodJoinPoint,{unintercept:function(){
     2774this.object[this.methodname]=this.methodfunc;
     2775},run:function(){
     2776var obj=this.object||dj_global;
     2777var args=arguments;
     2778var _254=[];
     2779for(var x=0;x<args.length;x++){
     2780_254[x]=args[x];
     2781}
     2782var _256=function(marr){
     2783if(!marr){
     2784dojo.debug("Null argument to unrollAdvice()");
     2785return;
     2786}
     2787var _258=marr[0]||dj_global;
     2788var _259=marr[1];
     2789if(!_258[_259]){
     2790dojo.raise("function \""+_259+"\" does not exist on \""+_258+"\"");
     2791}
     2792var _25a=marr[2]||dj_global;
     2793var _25b=marr[3];
     2794var msg=marr[6];
     2795var _25d;
     2796var to={args:[],jp_:this,object:obj,proceed:function(){
     2797return _258[_259].apply(_258,to.args);
     2798}};
     2799to.args=_254;
     2800var _25f=parseInt(marr[4]);
     2801var _260=((!isNaN(_25f))&&(marr[4]!==null)&&(typeof marr[4]!="undefined"));
     2802if(marr[5]){
     2803var rate=parseInt(marr[5]);
     2804var cur=new Date();
     2805var _263=false;
     2806if((marr["last"])&&((cur-marr.last)<=rate)){
     2807if(dojo.event.canTimeout){
     2808if(marr["delayTimer"]){
     2809clearTimeout(marr.delayTimer);
     2810}
     2811var tod=parseInt(rate*2);
     2812var mcpy=dojo.lang.shallowCopy(marr);
     2813marr.delayTimer=setTimeout(function(){
     2814mcpy[5]=0;
     2815_256(mcpy);
     2816},tod);
     2817}
     2818return;
     2819}else{
     2820marr.last=cur;
     2821}
     2822}
     2823if(_25b){
     2824_25a[_25b].call(_25a,to);
     2825}else{
     2826if((_260)&&((dojo.render.html)||(dojo.render.svg))){
     2827dj_global["setTimeout"](function(){
     2828if(msg){
     2829_258[_259].call(_258,to);
     2830}else{
     2831_258[_259].apply(_258,args);
     2832}
     2833},_25f);
     2834}else{
     2835if(msg){
     2836_258[_259].call(_258,to);
     2837}else{
     2838_258[_259].apply(_258,args);
     2839}
     2840}
     2841}
     2842};
     2843if(this.before.length>0){
     2844dojo.lang.forEach(this.before,_256,true);
     2845}
     2846var _266;
     2847if(this.around.length>0){
     2848var mi=new dojo.event.MethodInvocation(this,obj,args);
     2849_266=mi.proceed();
     2850}else{
     2851if(this.methodfunc){
     2852_266=this.object[this.methodname].apply(this.object,args);
     2853}
     2854}
     2855if(this.after.length>0){
     2856dojo.lang.forEach(this.after,_256,true);
     2857}
     2858return (this.methodfunc)?_266:null;
     2859},getArr:function(kind){
     2860var arr=this.after;
     2861if((typeof kind=="string")&&(kind.indexOf("before")!=-1)){
     2862arr=this.before;
     2863}else{
     2864if(kind=="around"){
     2865arr=this.around;
     2866}
     2867}
     2868return arr;
     2869},kwAddAdvice:function(args){
     2870this.addAdvice(args["adviceObj"],args["adviceFunc"],args["aroundObj"],args["aroundFunc"],args["adviceType"],args["precedence"],args["once"],args["delay"],args["rate"],args["adviceMsg"]);
     2871},addAdvice:function(_26b,_26c,_26d,_26e,_26f,_270,once,_272,rate,_274){
     2872var arr=this.getArr(_26f);
     2873if(!arr){
     2874dojo.raise("bad this: "+this);
     2875}
     2876var ao=[_26b,_26c,_26d,_26e,_272,rate,_274];
     2877if(once){
     2878if(this.hasAdvice(_26b,_26c,_26f,arr)>=0){
     2879return;
     2880}
     2881}
     2882if(_270=="first"){
     2883arr.unshift(ao);
     2884}else{
     2885arr.push(ao);
     2886}
     2887},hasAdvice:function(_277,_278,_279,arr){
     2888if(!arr){
     2889arr=this.getArr(_279);
     2890}
     2891var ind=-1;
     2892for(var x=0;x<arr.length;x++){
     2893if((arr[x][0]==_277)&&(arr[x][1]==_278)){
     2894ind=x;
     2895}
     2896}
     2897return ind;
     2898},removeAdvice:function(_27d,_27e,_27f,once){
     2899var arr=this.getArr(_27f);
     2900var ind=this.hasAdvice(_27d,_27e,_27f,arr);
     2901if(ind==-1){
     2902return false;
     2903}
     2904while(ind!=-1){
     2905arr.splice(ind,1);
     2906if(once){
     2907break;
     2908}
     2909ind=this.hasAdvice(_27d,_27e,_27f,arr);
     2910}
     2911return true;
     2912}});
     2913dojo.require("dojo.event");
     2914dojo.provide("dojo.event.topic");
     2915dojo.event.topic=new function(){
     2916this.topics={};
     2917this.getTopic=function(_283){
     2918if(!this.topics[_283]){
     2919this.topics[_283]=new this.TopicImpl(_283);
     2920}
     2921return this.topics[_283];
     2922};
     2923this.registerPublisher=function(_284,obj,_286){
     2924var _284=this.getTopic(_284);
     2925_284.registerPublisher(obj,_286);
     2926};
     2927this.subscribe=function(_287,obj,_289){
     2928var _287=this.getTopic(_287);
     2929_287.subscribe(obj,_289);
     2930};
     2931this.unsubscribe=function(_28a,obj,_28c){
     2932var _28a=this.getTopic(_28a);
     2933_28a.unsubscribe(obj,_28c);
     2934};
     2935this.publish=function(_28d,_28e){
     2936var _28d=this.getTopic(_28d);
     2937var args=[];
     2938if((arguments.length==2)&&(_28e.length)&&(typeof _28e!="string")){
     2939args=_28e;
     2940}else{
     2941var args=[];
     2942for(var x=1;x<arguments.length;x++){
     2943args.push(arguments[x]);
     2944}
     2945}
     2946_28d.sendMessage.apply(_28d,args);
     2947};
     2948};
     2949dojo.event.topic.TopicImpl=function(_291){
     2950this.topicName=_291;
     2951var self=this;
     2952self.subscribe=function(_293,_294){
     2953var tf=_294||_293;
     2954var to=(!_294)?dj_global:_293;
     2955dojo.event.kwConnect({srcObj:self,srcFunc:"sendMessage",adviceObj:to,adviceFunc:tf});
     2956};
     2957self.unsubscribe=function(_297,_298){
     2958var tf=(!_298)?_297:_298;
     2959var to=(!_298)?null:_297;
     2960dojo.event.kwDisconnect({srcObj:self,srcFunc:"sendMessage",adviceObj:to,adviceFunc:tf});
     2961};
     2962self.registerPublisher=function(_29b,_29c){
     2963dojo.event.connect(_29b,_29c,self,"sendMessage");
     2964};
     2965self.sendMessage=function(_29d){
     2966};
     2967};
     2968dojo.provide("dojo.event.browser");
     2969dojo.require("dojo.event");
     2970dojo_ie_clobber=new function(){
     2971this.clobberNodes=[];
     2972function nukeProp(node,prop){
     2973try{
     2974node[prop]=null;
     2975}
     2976catch(e){
     2977}
     2978try{
     2979delete node[prop];
     2980}
     2981catch(e){
     2982}
     2983try{
     2984node.removeAttribute(prop);
     2985}
     2986catch(e){
     2987}
     2988}
     2989this.clobber=function(_2a0){
     2990var na;
     2991var tna;
     2992if(_2a0){
     2993tna=_2a0.getElementsByTagName("*");
     2994na=[_2a0];
     2995for(var x=0;x<tna.length;x++){
     2996if(tna[x]["__doClobber__"]){
     2997na.push(tna[x]);
     2998}
     2999}
     3000}else{
     3001try{
     3002window.onload=null;
     3003}
     3004catch(e){
     3005}
     3006na=(this.clobberNodes.length)?this.clobberNodes:document.all;
     3007}
     3008tna=null;
     3009var _2a4={};
     3010for(var i=na.length-1;i>=0;i=i-1){
     3011var el=na[i];
     3012if(el["__clobberAttrs__"]){
     3013for(var j=0;j<el.__clobberAttrs__.length;j++){
     3014nukeProp(el,el.__clobberAttrs__[j]);
     3015}
     3016nukeProp(el,"__clobberAttrs__");
     3017nukeProp(el,"__doClobber__");
     3018}
     3019}
     3020na=null;
     3021};
     3022};
     3023if(dojo.render.html.ie){
     3024window.onunload=function(){
     3025dojo_ie_clobber.clobber();
     3026try{
     3027if((dojo["widget"])&&(dojo.widget["manager"])){
     3028dojo.widget.manager.destroyAll();
     3029}
     3030}
     3031catch(e){
     3032}
     3033try{
     3034window.onload=null;
     3035}
     3036catch(e){
     3037}
     3038try{
     3039window.onunload=null;
     3040}
     3041catch(e){
     3042}
     3043dojo_ie_clobber.clobberNodes=[];
     3044};
     3045}
     3046dojo.event.browser=new function(){
     3047var _2a8=0;
     3048this.clean=function(node){
     3049if(dojo.render.html.ie){
     3050dojo_ie_clobber.clobber(node);
     3051}
     3052};
     3053this.addClobberNode=function(node){
     3054if(!node["__doClobber__"]){
     3055node.__doClobber__=true;
     3056dojo_ie_clobber.clobberNodes.push(node);
     3057node.__clobberAttrs__=[];
     3058}
     3059};
     3060this.addClobberNodeAttrs=function(node,_2ac){
     3061this.addClobberNode(node);
     3062for(var x=0;x<_2ac.length;x++){
     3063node.__clobberAttrs__.push(_2ac[x]);
     3064}
     3065};
     3066this.removeListener=function(node,_2af,fp,_2b1){
     3067if(!_2b1){
     3068var _2b1=false;
     3069}
     3070_2af=_2af.toLowerCase();
     3071if(_2af.substr(0,2)=="on"){
     3072_2af=_2af.substr(2);
     3073}
     3074if(node.removeEventListener){
     3075node.removeEventListener(_2af,fp,_2b1);
     3076}
     3077};
     3078this.addListener=function(node,_2b3,fp,_2b5,_2b6){
     3079if(!node){
     3080return;
     3081}
     3082if(!_2b5){
     3083var _2b5=false;
     3084}
     3085_2b3=_2b3.toLowerCase();
     3086if(_2b3.substr(0,2)!="on"){
     3087_2b3="on"+_2b3;
     3088}
     3089if(!_2b6){
     3090var _2b7=function(evt){
     3091if(!evt){
     3092evt=window.event;
     3093}
     3094var ret=fp(dojo.event.browser.fixEvent(evt));
     3095if(_2b5){
     3096dojo.event.browser.stopEvent(evt);
     3097}
     3098return ret;
     3099};
     3100}else{
     3101_2b7=fp;
     3102}
     3103if(node.addEventListener){
     3104node.addEventListener(_2b3.substr(2),_2b7,_2b5);
     3105return _2b7;
     3106}else{
     3107if(typeof node[_2b3]=="function"){
     3108var _2ba=node[_2b3];
     3109node[_2b3]=function(e){
     3110_2ba(e);
     3111return _2b7(e);
     3112};
     3113}else{
     3114node[_2b3]=_2b7;
     3115}
     3116if(dojo.render.html.ie){
     3117this.addClobberNodeAttrs(node,[_2b3]);
     3118}
     3119return _2b7;
     3120}
     3121};
     3122this.isEvent=function(obj){
     3123return (typeof obj!="undefined")&&(typeof Event!="undefined")&&(obj.eventPhase);
     3124};
     3125this.currentEvent=null;
     3126this.callListener=function(_2bd,_2be){
     3127if(typeof _2bd!="function"){
     3128dojo.raise("listener not a function: "+_2bd);
     3129}
     3130dojo.event.browser.currentEvent.currentTarget=_2be;
     3131return _2bd.call(_2be,dojo.event.browser.currentEvent);
     3132};
     3133this.stopPropagation=function(){
     3134dojo.event.browser.currentEvent.cancelBubble=true;
     3135};
     3136this.preventDefault=function(){
     3137dojo.event.browser.currentEvent.returnValue=false;
     3138};
     3139this.keys={KEY_BACKSPACE:8,KEY_TAB:9,KEY_ENTER:13,KEY_SHIFT:16,KEY_CTRL:17,KEY_ALT:18,KEY_PAUSE:19,KEY_CAPS_LOCK:20,KEY_ESCAPE:27,KEY_SPACE:32,KEY_PAGE_UP:33,KEY_PAGE_DOWN:34,KEY_END:35,KEY_HOME:36,KEY_LEFT_ARROW:37,KEY_UP_ARROW:38,KEY_RIGHT_ARROW:39,KEY_DOWN_ARROW:40,KEY_INSERT:45,KEY_DELETE:46,KEY_LEFT_WINDOW:91,KEY_RIGHT_WINDOW:92,KEY_SELECT:93,KEY_F1:112,KEY_F2:113,KEY_F3:114,KEY_F4:115,KEY_F5:116,KEY_F6:117,KEY_F7:118,KEY_F8:119,KEY_F9:120,KEY_F10:121,KEY_F11:122,KEY_F12:123,KEY_NUM_LOCK:144,KEY_SCROLL_LOCK:145};
     3140this.revKeys=[];
     3141for(var key in this.keys){
     3142this.revKeys[this.keys[key]]=key;
     3143}
     3144this.fixEvent=function(evt){
     3145if((!evt)&&(window["event"])){
     3146var evt=window.event;
     3147}
     3148if((evt["type"])&&(evt["type"].indexOf("key")==0)){
     3149evt.keys=this.revKeys;
     3150for(var key in this.keys){
     3151evt[key]=this.keys[key];
     3152}
     3153if((dojo.render.html.ie)&&(evt["type"]=="keypress")){
     3154evt.charCode=evt.keyCode;
     3155}
     3156}
     3157if(dojo.render.html.ie){
     3158if(!evt.target){
     3159evt.target=evt.srcElement;
     3160}
     3161if(!evt.currentTarget){
     3162evt.currentTarget=evt.srcElement;
     3163}
     3164if(!evt.layerX){
     3165evt.layerX=evt.offsetX;
     3166}
     3167if(!evt.layerY){
     3168evt.layerY=evt.offsetY;
     3169}
     3170if(evt.fromElement){
     3171evt.relatedTarget=evt.fromElement;
     3172}
     3173if(evt.toElement){
     3174evt.relatedTarget=evt.toElement;
     3175}
     3176this.currentEvent=evt;
     3177evt.callListener=this.callListener;
     3178evt.stopPropagation=this.stopPropagation;
     3179evt.preventDefault=this.preventDefault;
     3180}
     3181return evt;
     3182};
     3183this.stopEvent=function(ev){
     3184if(window.event){
     3185ev.returnValue=false;
     3186ev.cancelBubble=true;
     3187}else{
     3188ev.preventDefault();
     3189ev.stopPropagation();
     3190}
     3191};
     3192};
     3193dojo.hostenv.conditionalLoadModule({common:["dojo.event","dojo.event.topic"],browser:["dojo.event.browser"]});
     3194dojo.hostenv.moduleLoaded("dojo.event.*");
     3195
  • templatetags/admin_modify.py

     
    1717def class_name_to_underscored(name):
    1818    return '_'.join([s.lower() for s in word_re.findall(name)[:-1]])
    1919
    20 def include_admin_script(script_path):
    21     return '<script type="text/javascript" src="%s%s"></script>' % (settings.ADMIN_MEDIA_PREFIX, script_path)
    22 include_admin_script = register.simple_tag(include_admin_script)
    23 
    2420def submit_row(context):
    2521    opts = context['opts']
    2622    change = context['change']
     
    163159    return ''.join([str(f) for f in form_fields])
    164160output_all = register.simple_tag(output_all)
    165161
    166 def auto_populated_field_script(auto_pop_fields, change = False):
    167     for field in auto_pop_fields:
    168         t = []
    169         if change:
    170             t.append('document.getElementById("id_%s")._changed = true;' % field.name)
    171         else:
    172             t.append('document.getElementById("id_%s").onchange = function() { this._changed = true; };' % field.name)
    173 
    174         add_values = ' + " " + '.join(['document.getElementById("id_%s").value' % g for g in field.prepopulate_from])
    175         for f in field.prepopulate_from:
    176             t.append('document.getElementById("id_%s").onkeyup = function() {' \
    177                      ' var e = document.getElementById("id_%s");' \
    178                      ' if(!e._changed) { e.value = URLify(%s, %s);} }; ' % (
    179                      f, field.name, add_values, field.maxlength))
    180     return ''.join(t)
    181 auto_populated_field_script = register.simple_tag(auto_populated_field_script)
    182 
    183 def filter_interface_script_maybe(bound_field):
    184     f = bound_field.field
    185     if f.rel and isinstance(f.rel, models.ManyToManyRel) and f.rel.filter_interface:
    186        return '<script type="text/javascript">addEvent(window, "load", function(e) {' \
    187               ' SelectFilter.init("id_%s", "%s", %s, "%s"); });</script>\n' % (
    188               f.name, f.verbose_name, f.rel.filter_interface-1, settings.ADMIN_MEDIA_PREFIX)
    189     else:
    190         return ''
    191 filter_interface_script_maybe = register.simple_tag(filter_interface_script_maybe)
    192 
    193162def field_widget(parser, token):
    194163    bits = token.contents.split()
    195164    if len(bits) != 2:
  • views/main.py

     
    7979            myappend('_' + item)
    8080    return "".join(res)
    8181
    82 def get_javascript_imports(opts, auto_populated_fields, field_sets):
    83 # Put in any necessary JavaScript imports.
    84     js = ['js/core.js', 'js/admin/RelatedObjectLookups.js']
    85     if auto_populated_fields:
    86         js.append('js/urlify.js')
    87     if opts.has_field_type(models.DateTimeField) or opts.has_field_type(models.TimeField) or opts.has_field_type(models.DateField):
    88         js.extend(['js/calendar.js', 'js/admin/DateTimeShortcuts.js'])
    89     if opts.get_ordered_objects():
    90         js.extend(['js/getElementsBySelector.js', 'js/dom-drag.js' , 'js/admin/ordering.js'])
    91     if opts.admin.js:
    92         js.extend(opts.admin.js)
    93     seen_collapse = False
    94     for field_set in field_sets:
    95         if not seen_collapse and 'collapse' in field_set.classes:
    96             seen_collapse = True
    97             js.append('js/admin/CollapsedFieldsets.js')
    98 
    99         for field_line in field_set:
    100             try:
    101                 for f in field_line:
    102                     if f.rel and isinstance(f, models.ManyToManyField) and f.rel.filter_interface:
    103                         js.extend(['js/SelectBox.js' , 'js/SelectFilter2.js'])
    104                         raise StopIteration
    105             except StopIteration:
    106                 break
    107     return js
    108 
    10982class AdminBoundField(object):
    11083    def __init__(self, field, field_mapping, original):
    11184        self.field = field
     
    190163def render_change_form(model, manipulator, context, add=False, change=False, form_url=''):
    191164    opts = model._meta
    192165    app_label = opts.app_label
    193     auto_populated_fields = [f for f in opts.fields if f.prepopulate_from]
     166    auto_populated_fields = add and [f for f in opts.fields if f.prepopulate_from]
     167    many_to_many_filters = [f for f in opts.many_to_many if isinstance(f.rel, models.ManyToManyRel) and f.rel.filter_interface]
     168    date_time_fields = [f for f in opts.fields if f.get_internal_type() in ['DateField', 'TimeField', 'DateTimeField']]
    194169    field_sets = opts.admin.get_field_sets(opts)
    195170    original = getattr(manipulator, 'original_object', None)
    196171    bound_field_sets = [field_set.bind(context['form'], original, AdminBoundFieldSet) for field_set in field_sets]
     
    201176        'add': add,
    202177        'change': change,
    203178        'has_delete_permission': context['perms'][app_label][opts.get_delete_permission()],
    204         'has_change_permission': context['perms'][app_label][opts.get_change_permission()],
    205179        'has_file_field': opts.has_field_type(models.FileField),
    206180        'has_absolute_url': hasattr(model, 'get_absolute_url'),
    207181        'auto_populated_fields': auto_populated_fields,
     182        'many_to_many_filters': many_to_many_filters,
     183        'date_time_fields': date_time_fields,
    208184        'bound_field_sets': bound_field_sets,
    209185        'first_form_field_id': first_form_field_id,
    210         'javascript_imports': get_javascript_imports(opts, auto_populated_fields, field_sets),
    211186        'ordered_objects': ordered_objects,
    212187        'inline_related_objects': inline_related_objects,
    213188        'form_url': form_url,
     
    220195        "admin/%s/change_form" % app_label,
    221196        "admin/change_form"], context_instance=context)
    222197
     198
    223199def index(request):
    224200    return render_to_response('admin/index', {'title': _('Site administration')}, context_instance=template.RequestContext(request))
    225201index = staff_member_required(never_cache(index))
     
    264240                    post_url_continue += "?_popup=1"
    265241                return HttpResponseRedirect(post_url_continue % pk_value)
    266242            if request.POST.has_key("_popup"):
    267                 return HttpResponse('<script type="text/javascript">opener.dismissAddAnotherPopup(window, %s, "%s");</script>' % \
     243                return HttpResponse('<script type="text/javascript">opener.django.admin.RelatedLookups.dismissAddAnotherPopup(window, %s, "%s");</script>' % \
    268244                    (pk_value, str(new_object).replace('"', '\\"')))
    269245            elif request.POST.has_key("_addanother"):
    270246                request.user.message_set.create(message=msg + ' ' + (_("You may add another %s below.") % opts.verbose_name))
  • templates/widget/foreign.html

     
    22{% output_all bound_field.form_fields %}
    33{% if bound_field.raw_id_admin %}
    44    {% if bound_field.field.rel.limit_choices_to %}
    5         <a href="../../../{{ bound_field.field.rel.to.app_label }}/{{ bound_field.field.rel.to.module_name }}/?{% for limit_choice in bound_field.field.rel.limit_choices_to.items %}{% if not forloop.first %}&amp;{% endif %}{{ limit_choice|join:"=" }}{% endfor %}" class="related-lookup" id="lookup_{{ bound_field.element_id }}" onclick="return showRelatedObjectLookupPopup(this);"> <img src="{% admin_media_prefix %}img/admin/selector-search.gif" width="16" height="16" alt="Lookup"></a>
     5        <a href="../../../{{ bound_field.field.rel.to.app_label }}/{{ bound_field.field.rel.to.module_name }}/?{% for limit_choice in bound_field.field.rel.limit_choices_to.items %}{% if not forloop.first %}&amp;{% endif %}{{ limit_choice|join:"=" }}{% endfor %}" class="related-lookup" id="lookup_{{ bound_field.element_id }}" onclick="return django.admin.RelatedLookups.showRelatedObjectLookupPopup(this);"> <img src="{% admin_media_prefix %}img/admin/selector-search.gif" width="16" height="16" alt="Lookup"></a>
    66    {% else %}
    7         <a href="{{ bound_field.related_url }}" class="related-lookup" id="lookup_{{ bound_field.element_id }}" onclick="return showRelatedObjectLookupPopup(this);"> <img src="{% admin_media_prefix %}img/admin/selector-search.gif" width="16" height="16" alt="Lookup"></a>
     7        <a href="{{ bound_field.related_url }}" class="related-lookup" id="lookup_{{ bound_field.element_id }}" onclick="return django.admin.RelatedLookups.showRelatedObjectLookupPopup(this);"> <img src="{% admin_media_prefix %}img/admin/selector-search.gif" width="16" height="16" alt="Lookup"></a>
    88    {% endif %}
    99{% else %}
    1010{% if bound_field.needs_add_label %}
    11     <a href="{{ bound_field.related_url }}add/" class="add-another" id="add_{{ bound_field.element_id }}" onclick="return showAddAnotherPopup(this);"> <img src="{% admin_media_prefix %}img/admin/icon_addlink.gif" width="10" height="10" alt="Add Another"/></a>
     11    <a href="{{ bound_field.related_url }}add/" class="add-another" id="add_{{ bound_field.element_id }}"> <img src="{% admin_media_prefix %}img/admin/icon_addlink.gif" width="10" height="10" alt="Add Another"/></a>
    1212{% endif %}{% endif %}
  • templates/admin/change_form.html

     
    22{% load i18n admin_modify adminmedia %}
    33{% block extrahead %}{{ block.super }}
    44<script type="text/javascript" src="../../../jsi18n/"></script>
    5 {% for js in javascript_imports %}{% include_admin_script js %}{% endfor %}
     5<script type="text/javascript" src="../../../../media/js/dojo/dojo.js"></script>
     6<script type="text/javascript">
     7        dojo.setModulePrefix('django', '../django');
     8        var admin_media_prefix = '{% admin_media_prefix %}';
     9{% if add %}
     10        var first_form_field_id = '{{ first_form_field_id }}';
     11{% endif %}
     12{% if auto_populated_fields %}
     13        var auto_populate_array = {
     14        {% for field in auto_populated_fields %}
     15                'id_{{ field.name }}': [{% for source_field in field.prepopulate_from %}'id_{{ source_field }}'{% if not forloop.last %},{% endif %}{% endfor %}]{% if not forloop.last %},{% endif %}
     16        {% endfor %}           
     17        };
     18{% endif %}
     19{% if many_to_many_filters %}
     20        var select_filter_array = {
     21                {% for field in many_to_many_filters %}
     22                        'id_{{ field.name }}': ['{{ field.verbose_name }}', {% ifequal field.rel.filter_interface 1 %}0{% else %}1{% endifequal %}, admin_media_prefix]{% if not forloop.last %},{% endif %}
     23                {% endfor %}
     24        };
     25{% endif %}
     26{% if date_time_fields %}
     27        var date_time_fields = true;
     28{% endif %}
     29        dojo.require('django.admin.*');
     30</script>
    631{% endblock %}
    732{% block stylesheet %}{% admin_media_prefix %}css/forms.css{% endblock %}
    833{% block coltype %}{% if ordered_objects %}colMS{% else %}colM{% endif %}{% endblock %}
     
    3762    {% for bound_field_line in bound_field_set %}
    3863        {% admin_field_line bound_field_line %}
    3964        {% for bound_field in bound_field_line %}
    40             {% filter_interface_script_maybe bound_field %}
    4165        {% endfor %}
    4266    {% endfor %}
    4367   </fieldset>
     
    5579{% for related_object in inline_related_objects %}{% edit_inline related_object %}{% endfor %}
    5680{% block after_related_objects %}{% endblock %}
    5781{% submit_row %}
    58 {% if add %}
    59    <script type="text/javascript">document.getElementById("{{ first_form_field_id }}").focus();</script>
    60 {% endif %}
    61 {% if auto_populated_fields %}
    62    <script type="text/javascript">
    63    {% auto_populated_field_script auto_populated_fields change %}
    64    </script>
    65 {% endif %}
    6682</div>
    6783</form></div>
    6884{% endblock %}
Back to Top